From a416bfb2c7ef352d900d9164f6317bb2487b343d Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Mon, 22 Oct 2018 18:48:37 +0800 Subject: [PATCH 1/5] *: move github.com/pingcap/tidb/parser here --- Makefile | 27 + ast/ast.go | 156 + ast/base.go | 101 + ast/ddl.go | 893 ++++ ast/ddl_test.go | 64 + ast/dml.go | 1037 +++++ ast/dml_test.go | 70 + ast/expressions.go | 914 +++++ ast/expressions_test.go | 103 + ast/flag.go | 156 + ast/flag_test.go | 153 + ast/format_test.go | 98 + ast/functions.go | 520 +++ ast/functions_test.go | 38 + ast/misc.go | 879 ++++ ast/misc_test.go | 190 + ast/read_only_checker.go | 61 + ast/read_only_checker_test.go | 44 + ast/stats.go | 91 + auth/auth.go | 103 + auth/auth_test.go | 50 + bench_test.go | 66 + charset/charset.go | 417 ++ charset/charset_test.go | 94 + charset/encoding_table.go | 260 ++ consistent_test.go | 108 + format/format.go | 195 + format/format_test.go | 60 + goyacc/main.go | 819 ++++ lexer.go | 785 ++++ lexer_test.go | 351 ++ misc.go | 618 +++ model/ddl.go | 384 ++ model/flags.go | 43 + model/model.go | 572 +++ model/model_test.go | 307 ++ mysql/charset.go | 608 +++ mysql/const.go | 695 ++++ mysql/const_test.go | 321 ++ mysql/errcode.go | 910 +++++ mysql/errname.go | 907 +++++ mysql/error.go | 71 + mysql/error_test.go | 37 + mysql/locale_format.go | 98 + mysql/state.go | 258 ++ mysql/type.go | 155 + mysql/type_test.go | 37 + mysql/util.go | 93 + opcode/opcode.go | 138 + opcode/opcode_test.go | 49 + parser.y | 7207 +++++++++++++++++++++++++++++++++ parser_test.go | 2429 +++++++++++ terror/terror.go | 344 ++ terror/terror_test.go | 163 + types/etc.go | 258 ++ types/eval_type.go | 42 + types/field_type.go | 258 ++ yy_parser.go | 239 ++ 58 files changed, 26144 insertions(+) create mode 100644 Makefile create mode 100644 ast/ast.go create mode 100644 ast/base.go create mode 100644 ast/ddl.go create mode 100644 ast/ddl_test.go create mode 100644 ast/dml.go create mode 100644 ast/dml_test.go create mode 100644 ast/expressions.go create mode 100644 ast/expressions_test.go create mode 100644 ast/flag.go create mode 100644 ast/flag_test.go create mode 100644 ast/format_test.go create mode 100644 ast/functions.go create mode 100644 ast/functions_test.go create mode 100644 ast/misc.go create mode 100644 ast/misc_test.go create mode 100644 ast/read_only_checker.go create mode 100644 ast/read_only_checker_test.go create mode 100644 ast/stats.go create mode 100644 auth/auth.go create mode 100644 auth/auth_test.go create mode 100644 bench_test.go create mode 100644 charset/charset.go create mode 100644 charset/charset_test.go create mode 100644 charset/encoding_table.go create mode 100644 consistent_test.go create mode 100644 format/format.go create mode 100644 format/format_test.go create mode 100644 goyacc/main.go create mode 100644 lexer.go create mode 100644 lexer_test.go create mode 100644 misc.go create mode 100644 model/ddl.go create mode 100644 model/flags.go create mode 100644 model/model.go create mode 100644 model/model_test.go create mode 100644 mysql/charset.go create mode 100644 mysql/const.go create mode 100644 mysql/const_test.go create mode 100644 mysql/errcode.go create mode 100644 mysql/errname.go create mode 100644 mysql/error.go create mode 100644 mysql/error_test.go create mode 100644 mysql/locale_format.go create mode 100644 mysql/state.go create mode 100644 mysql/type.go create mode 100644 mysql/type_test.go create mode 100644 mysql/util.go create mode 100644 opcode/opcode.go create mode 100644 opcode/opcode_test.go create mode 100644 parser.y create mode 100644 parser_test.go create mode 100644 terror/terror.go create mode 100644 terror/terror_test.go create mode 100644 types/etc.go create mode 100644 types/eval_type.go create mode 100644 types/field_type.go create mode 100644 yy_parser.go diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..722622357 --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +.PHONEY: all parser parserlib goyacc + +all: parser + +parserlib: parser.go + +parser.go: parser.y + make parser + +parser: bin/goyacc + bin/goyacc -o /dev/null parser.y + bin/goyacc -o parser.go parser.y 2>&1 | egrep "(shift|reduce)/reduce" | awk '{print} END {if (NR > 0) {print "Find conflict in parser.y. Please check y.output for more information."; exit 1;}}' + rm -f y.output + + @if [ $(ARCH) = $(LINUX) ]; \ + then \ + sed -i -e 's|//line.*||' -e 's/yyEofCode/yyEOFCode/' parser.go; \ + elif [ $(ARCH) = $(MAC) ]; \ + then \ + /usr/bin/sed -i "" 's|//line.*||' parser.go; \ + /usr/bin/sed -i "" 's/yyEofCode/yyEOFCode/' parser.go; \ + fi + + @awk 'BEGIN{print "// Code generated by goyacc"} {print $0}' parser.go > tmp_parser.go && mv tmp_parser.go parser.go; + +bin/goyacc: + go build -o bin/goyacc goyacc/main.go diff --git a/ast/ast.go b/ast/ast.go new file mode 100644 index 000000000..2f3be0b4b --- /dev/null +++ b/ast/ast.go @@ -0,0 +1,156 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package ast is the abstract syntax tree parsed from a SQL statement by parser. +// It can be analysed and transformed by optimizer. +package ast + +import ( + "io" + + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +// Node is the basic element of the AST. +// Interfaces embed Node should have 'Node' name suffix. +type Node interface { + // Accept accepts Visitor to visit itself. + // The returned node should replace original node. + // ok returns false to stop visiting. + // + // Implementation of this method should first call visitor.Enter, + // assign the returned node to its method receiver, if skipChildren returns true, + // children should be skipped. Otherwise, call its children in particular order that + // later elements depends on former elements. Finally, return visitor.Leave. + Accept(v Visitor) (node Node, ok bool) + // Text returns the original text of the element. + Text() string + // SetText sets original text to the Node. + SetText(text string) +} + +// Flags indicates whether an expression contains certain types of expression. +const ( + FlagConstant uint64 = 0 + FlagHasParamMarker uint64 = 1 << iota + FlagHasFunc + FlagHasReference + FlagHasAggregateFunc + FlagHasSubquery + FlagHasVariable + FlagHasDefault + FlagPreEvaluated +) + +// ExprNode is a node that can be evaluated. +// Name of implementations should have 'Expr' suffix. +type ExprNode interface { + // Node is embedded in ExprNode. + Node + // SetType sets evaluation type to the expression. + SetType(tp *types.FieldType) + // GetType gets the evaluation type of the expression. + GetType() *types.FieldType + // SetFlag sets flag to the expression. + // Flag indicates whether the expression contains + // parameter marker, reference, aggregate function... + SetFlag(flag uint64) + // GetFlag returns the flag of the expression. + GetFlag() uint64 + + // Format formats the AST into a writer. + Format(w io.Writer) +} + +// OptBinary is used for parser. +type OptBinary struct { + IsBinary bool + Charset string +} + +// FuncNode represents function call expression node. +type FuncNode interface { + ExprNode + functionExpression() +} + +// StmtNode represents statement node. +// Name of implementations should have 'Stmt' suffix. +type StmtNode interface { + Node + statement() +} + +// DDLNode represents DDL statement node. +type DDLNode interface { + StmtNode + ddlStatement() +} + +// DMLNode represents DML statement node. +type DMLNode interface { + StmtNode + dmlStatement() +} + +// ResultField represents a result field which can be a column from a table, +// or an expression in select field. It is a generated property during +// binding process. ResultField is the key element to evaluate a ColumnNameExpr. +// After resolving process, every ColumnNameExpr will be resolved to a ResultField. +// During execution, every row retrieved from table will set the row value to +// ResultFields of that table, so ColumnNameExpr resolved to that ResultField can be +// easily evaluated. +type ResultField struct { + Column *model.ColumnInfo + ColumnAsName model.CIStr + Table *model.TableInfo + TableAsName model.CIStr + DBName model.CIStr + + // Expr represents the expression for the result field. If it is generated from a select field, it would + // be the expression of that select field, otherwise the type would be ValueExpr and value + // will be set for every retrieved row. + Expr ExprNode + TableName *TableName + // Referenced indicates the result field has been referenced or not. + // If not, we don't need to get the values. + Referenced bool +} + +// ResultSetNode interface has a ResultFields property, represents a Node that returns result set. +// Implementations include SelectStmt, SubqueryExpr, TableSource, TableName and Join. +type ResultSetNode interface { + Node +} + +// SensitiveStmtNode overloads StmtNode and provides a SecureText method. +type SensitiveStmtNode interface { + StmtNode + // SecureText is different from Text that it hide password information. + SecureText() string +} + +// Visitor visits a Node. +type Visitor interface { + // Enter is called before children nodes are visited. + // The returned node must be the same type as the input node n. + // skipChildren returns true means children nodes should be skipped, + // this is useful when work is done in Enter and there is no need to visit children. + Enter(n Node) (node Node, skipChildren bool) + // Leave is called after children nodes have been visited. + // The returned node's type can be different from the input node if it is a ExprNode, + // Non-expression node must be the same type as the input node n. + // ok returns false to stop visiting. + Leave(n Node) (node Node, ok bool) +} diff --git a/ast/base.go b/ast/base.go new file mode 100644 index 000000000..984d8e4d9 --- /dev/null +++ b/ast/base.go @@ -0,0 +1,101 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import "github.com/pingcap/parser/types" + +// node is the struct implements node interface except for Accept method. +// Node implementations should embed it in. +type node struct { + text string +} + +// SetText implements Node interface. +func (n *node) SetText(text string) { + n.text = text +} + +// Text implements Node interface. +func (n *node) Text() string { + return n.text +} + +// stmtNode implements StmtNode interface. +// Statement implementations should embed it in. +type stmtNode struct { + node +} + +// statement implements StmtNode interface. +func (sn *stmtNode) statement() {} + +// ddlNode implements DDLNode interface. +// DDL implementations should embed it in. +type ddlNode struct { + stmtNode +} + +// ddlStatement implements DDLNode interface. +func (dn *ddlNode) ddlStatement() {} + +// dmlNode is the struct implements DMLNode interface. +// DML implementations should embed it in. +type dmlNode struct { + stmtNode +} + +// dmlStatement implements DMLNode interface. +func (dn *dmlNode) dmlStatement() {} + +// exprNode is the struct implements Expression interface. +// Expression implementations should embed it in. +type exprNode struct { + node + Type types.FieldType + flag uint64 +} + +// TexprNode is exported for parser driver. +type TexprNode = exprNode + +// SetType implements ExprNode interface. +func (en *exprNode) SetType(tp *types.FieldType) { + en.Type = *tp +} + +// GetType implements ExprNode interface. +func (en *exprNode) GetType() *types.FieldType { + return &en.Type +} + +// SetFlag implements ExprNode interface. +func (en *exprNode) SetFlag(flag uint64) { + en.flag = flag +} + +// GetFlag implements ExprNode interface. +func (en *exprNode) GetFlag() uint64 { + return en.flag +} + +type funcNode struct { + exprNode +} + +// functionExpression implements FunctionNode interface. +func (fn *funcNode) functionExpression() {} + +type resultSetNode struct { + resultFields []*ResultField +} diff --git a/ast/ddl.go b/ast/ddl.go new file mode 100644 index 000000000..aefa2eed2 --- /dev/null +++ b/ast/ddl.go @@ -0,0 +1,893 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +var ( + _ DDLNode = &AlterTableStmt{} + _ DDLNode = &CreateDatabaseStmt{} + _ DDLNode = &CreateIndexStmt{} + _ DDLNode = &CreateTableStmt{} + _ DDLNode = &CreateViewStmt{} + _ DDLNode = &DropDatabaseStmt{} + _ DDLNode = &DropIndexStmt{} + _ DDLNode = &DropTableStmt{} + _ DDLNode = &RenameTableStmt{} + _ DDLNode = &TruncateTableStmt{} + + _ Node = &AlterTableSpec{} + _ Node = &ColumnDef{} + _ Node = &ColumnOption{} + _ Node = &ColumnPosition{} + _ Node = &Constraint{} + _ Node = &IndexColName{} + _ Node = &ReferenceDef{} +) + +// CharsetOpt is used for parsing charset option from SQL. +type CharsetOpt struct { + Chs string + Col string +} + +// DatabaseOptionType is the type for database options. +type DatabaseOptionType int + +// Database option types. +const ( + DatabaseOptionNone DatabaseOptionType = iota + DatabaseOptionCharset + DatabaseOptionCollate +) + +// DatabaseOption represents database option. +type DatabaseOption struct { + Tp DatabaseOptionType + Value string +} + +// CreateDatabaseStmt is a statement to create a database. +// See https://dev.mysql.com/doc/refman/5.7/en/create-database.html +type CreateDatabaseStmt struct { + ddlNode + + IfNotExists bool + Name string + Options []*DatabaseOption +} + +// Accept implements Node Accept interface. +func (n *CreateDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateDatabaseStmt) + return v.Leave(n) +} + +// DropDatabaseStmt is a statement to drop a database and all tables in the database. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-database.html +type DropDatabaseStmt struct { + ddlNode + + IfExists bool + Name string +} + +// Accept implements Node Accept interface. +func (n *DropDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropDatabaseStmt) + return v.Leave(n) +} + +// IndexColName is used for parsing index column name from SQL. +type IndexColName struct { + node + + Column *ColumnName + Length int +} + +// Accept implements Node Accept interface. +func (n *IndexColName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexColName) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + return v.Leave(n) +} + +// ReferenceDef is used for parsing foreign key reference option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html +type ReferenceDef struct { + node + + Table *TableName + IndexColNames []*IndexColName + OnDelete *OnDeleteOpt + OnUpdate *OnUpdateOpt +} + +// Accept implements Node Accept interface. +func (n *ReferenceDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ReferenceDef) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexColNames { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexColNames[i] = node.(*IndexColName) + } + onDelete, ok := n.OnDelete.Accept(v) + if !ok { + return n, false + } + n.OnDelete = onDelete.(*OnDeleteOpt) + onUpdate, ok := n.OnUpdate.Accept(v) + if !ok { + return n, false + } + n.OnUpdate = onUpdate.(*OnUpdateOpt) + return v.Leave(n) +} + +// ReferOptionType is the type for refer options. +type ReferOptionType int + +// Refer option types. +const ( + ReferOptionNoOption ReferOptionType = iota + ReferOptionRestrict + ReferOptionCascade + ReferOptionSetNull + ReferOptionNoAction +) + +// String implements fmt.Stringer interface. +func (r ReferOptionType) String() string { + switch r { + case ReferOptionRestrict: + return "RESTRICT" + case ReferOptionCascade: + return "CASCADE" + case ReferOptionSetNull: + return "SET NULL" + case ReferOptionNoAction: + return "NO ACTION" + } + return "" +} + +// OnDeleteOpt is used for optional on delete clause. +type OnDeleteOpt struct { + node + ReferOpt ReferOptionType +} + +// Accept implements Node Accept interface. +func (n *OnDeleteOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnDeleteOpt) + return v.Leave(n) +} + +// OnUpdateOpt is used for optional on update clause. +type OnUpdateOpt struct { + node + ReferOpt ReferOptionType +} + +// Accept implements Node Accept interface. +func (n *OnUpdateOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnUpdateOpt) + return v.Leave(n) +} + +// ColumnOptionType is the type for ColumnOption. +type ColumnOptionType int + +// ColumnOption types. +const ( + ColumnOptionNoOption ColumnOptionType = iota + ColumnOptionPrimaryKey + ColumnOptionNotNull + ColumnOptionAutoIncrement + ColumnOptionDefaultValue + ColumnOptionUniqKey + ColumnOptionNull + ColumnOptionOnUpdate // For Timestamp and Datetime only. + ColumnOptionFulltext + ColumnOptionComment + ColumnOptionGenerated + ColumnOptionReference +) + +// ColumnOption is used for parsing column constraint info from SQL. +type ColumnOption struct { + node + + Tp ColumnOptionType + // Expr is used for ColumnOptionDefaultValue/ColumnOptionOnUpdateColumnOptionGenerated. + // For ColumnOptionDefaultValue or ColumnOptionOnUpdate, it's the target value. + // For ColumnOptionGenerated, it's the target expression. + Expr ExprNode + // Stored is only for ColumnOptionGenerated, default is false. + Stored bool + // Refer is used for foreign key. + Refer *ReferenceDef +} + +// Accept implements Node Accept interface. +func (n *ColumnOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnOption) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// IndexOption is the index options. +// KEY_BLOCK_SIZE [=] value +// | index_type +// | WITH PARSER parser_name +// | COMMENT 'string' +// See http://dev.mysql.com/doc/refman/5.7/en/create-table.html +type IndexOption struct { + node + + KeyBlockSize uint64 + Tp model.IndexType + Comment string +} + +// Accept implements Node Accept interface. +func (n *IndexOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexOption) + return v.Leave(n) +} + +// ConstraintType is the type for Constraint. +type ConstraintType int + +// ConstraintTypes +const ( + ConstraintNoConstraint ConstraintType = iota + ConstraintPrimaryKey + ConstraintKey + ConstraintIndex + ConstraintUniq + ConstraintUniqKey + ConstraintUniqIndex + ConstraintForeignKey + ConstraintFulltext +) + +// Constraint is constraint for table definition. +type Constraint struct { + node + + Tp ConstraintType + Name string + + Keys []*IndexColName // Used for PRIMARY KEY, UNIQUE, ...... + + Refer *ReferenceDef // Used for foreign key. + + Option *IndexOption // Index Options +} + +// Accept implements Node Accept interface. +func (n *Constraint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Constraint) + for i, val := range n.Keys { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Keys[i] = node.(*IndexColName) + } + if n.Refer != nil { + node, ok := n.Refer.Accept(v) + if !ok { + return n, false + } + n.Refer = node.(*ReferenceDef) + } + if n.Option != nil { + node, ok := n.Option.Accept(v) + if !ok { + return n, false + } + n.Option = node.(*IndexOption) + } + return v.Leave(n) +} + +// ColumnDef is used for parsing column definition from SQL. +type ColumnDef struct { + node + + Name *ColumnName + Tp *types.FieldType + Options []*ColumnOption +} + +// Accept implements Node Accept interface. +func (n *ColumnDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnDef) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + for i, val := range n.Options { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Options[i] = node.(*ColumnOption) + } + return v.Leave(n) +} + +// CreateTableStmt is a statement to create a table. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table.html +type CreateTableStmt struct { + ddlNode + + IfNotExists bool + Table *TableName + ReferTable *TableName + Cols []*ColumnDef + Constraints []*Constraint + Options []*TableOption + Partition *PartitionOptions + OnDuplicate OnDuplicateCreateTableSelectType + Select ResultSetNode +} + +// Accept implements Node Accept interface. +func (n *CreateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + if n.ReferTable != nil { + node, ok = n.ReferTable.Accept(v) + if !ok { + return n, false + } + n.ReferTable = node.(*TableName) + } + for i, val := range n.Cols { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnDef) + } + for i, val := range n.Constraints { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Constraints[i] = node.(*Constraint) + } + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + + return v.Leave(n) +} + +// DropTableStmt is a statement to drop one or more tables. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-table.html +type DropTableStmt struct { + ddlNode + + IfExists bool + Tables []*TableName +} + +// Accept implements Node Accept interface. +func (n *DropTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropTableStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +// RenameTableStmt is a statement to rename a table. +// See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html +type RenameTableStmt struct { + ddlNode + + OldTable *TableName + NewTable *TableName + + // TableToTables is only useful for syncer which depends heavily on tidb parser to do some dirty work for now. + // TODO: Refactor this when you are going to add full support for multiple schema changes. + TableToTables []*TableToTable +} + +// Accept implements Node Accept interface. +func (n *RenameTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RenameTableStmt) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + + for i, t := range n.TableToTables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.TableToTables[i] = node.(*TableToTable) + } + + return v.Leave(n) +} + +// TableToTable represents renaming old table to new table used in RenameTableStmt. +type TableToTable struct { + node + OldTable *TableName + NewTable *TableName +} + +// Accept implements Node Accept interface. +func (n *TableToTable) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableToTable) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + return v.Leave(n) +} + +// CreateViewStmt is a statement to create a View. +// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html +type CreateViewStmt struct { + ddlNode + + OrReplace bool + ViewName *TableName + Cols []model.CIStr + Select StmtNode +} + +// Accept implements Node Accept interface. +func (n *CreateViewStmt) Accept(v Visitor) (Node, bool) { + // TODO: implement the details. + return n, true +} + +// CreateIndexStmt is a statement to create an index. +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type CreateIndexStmt struct { + ddlNode + + IndexName string + Table *TableName + Unique bool + IndexColNames []*IndexColName + IndexOption *IndexOption +} + +// Accept implements Node Accept interface. +func (n *CreateIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexColNames { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexColNames[i] = node.(*IndexColName) + } + if n.IndexOption != nil { + node, ok := n.IndexOption.Accept(v) + if !ok { + return n, false + } + n.IndexOption = node.(*IndexOption) + } + return v.Leave(n) +} + +// DropIndexStmt is a statement to drop the index. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-index.html +type DropIndexStmt struct { + ddlNode + + IfExists bool + IndexName string + Table *TableName +} + +// Accept implements Node Accept interface. +func (n *DropIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// TableOptionType is the type for TableOption +type TableOptionType int + +// TableOption types. +const ( + TableOptionNone TableOptionType = iota + TableOptionEngine + TableOptionCharset + TableOptionCollate + TableOptionAutoIncrement + TableOptionComment + TableOptionAvgRowLength + TableOptionCheckSum + TableOptionCompression + TableOptionConnection + TableOptionPassword + TableOptionKeyBlockSize + TableOptionMaxRows + TableOptionMinRows + TableOptionDelayKeyWrite + TableOptionRowFormat + TableOptionStatsPersistent + TableOptionShardRowID + TableOptionPackKeys +) + +// RowFormat types +const ( + RowFormatDefault uint64 = iota + 1 + RowFormatDynamic + RowFormatFixed + RowFormatCompressed + RowFormatRedundant + RowFormatCompact +) + +// OnDuplicateCreateTableSelectType is the option that handle unique key values in 'CREATE TABLE ... SELECT'. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table-select.html +type OnDuplicateCreateTableSelectType int + +// OnDuplicateCreateTableSelect types +const ( + OnDuplicateCreateTableSelectError OnDuplicateCreateTableSelectType = iota + OnDuplicateCreateTableSelectIgnore + OnDuplicateCreateTableSelectReplace +) + +// TableOption is used for parsing table option from SQL. +type TableOption struct { + Tp TableOptionType + StrValue string + UintValue uint64 +} + +// ColumnPositionType is the type for ColumnPosition. +type ColumnPositionType int + +// ColumnPosition Types +const ( + ColumnPositionNone ColumnPositionType = iota + ColumnPositionFirst + ColumnPositionAfter +) + +// ColumnPosition represent the position of the newly added column +type ColumnPosition struct { + node + // Tp is either ColumnPositionNone, ColumnPositionFirst or ColumnPositionAfter. + Tp ColumnPositionType + // RelativeColumn is the column the newly added column after if type is ColumnPositionAfter + RelativeColumn *ColumnName +} + +// Accept implements Node Accept interface. +func (n *ColumnPosition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnPosition) + if n.RelativeColumn != nil { + node, ok := n.RelativeColumn.Accept(v) + if !ok { + return n, false + } + n.RelativeColumn = node.(*ColumnName) + } + return v.Leave(n) +} + +// AlterTableType is the type for AlterTableSpec. +type AlterTableType int + +// AlterTable types. +const ( + AlterTableOption AlterTableType = iota + 1 + AlterTableAddColumns + AlterTableAddConstraint + AlterTableDropColumn + AlterTableDropPrimaryKey + AlterTableDropIndex + AlterTableDropForeignKey + AlterTableModifyColumn + AlterTableChangeColumn + AlterTableRenameTable + AlterTableAlterColumn + AlterTableLock + AlterTableAlgorithm + AlterTableRenameIndex + AlterTableForce + AlterTableAddPartitions + AlterTableDropPartition + +// TODO: Add more actions +) + +// LockType is the type for AlterTableSpec. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-concurrency +type LockType byte + +// Lock Types. +const ( + LockTypeNone LockType = iota + 1 + LockTypeDefault + LockTypeShared + LockTypeExclusive +) + +// AlterTableSpec represents alter table specification. +type AlterTableSpec struct { + node + + Tp AlterTableType + Name string + Constraint *Constraint + Options []*TableOption + NewTable *TableName + NewColumns []*ColumnDef + OldColumnName *ColumnName + Position *ColumnPosition + LockType LockType + Comment string + FromKey model.CIStr + ToKey model.CIStr + PartDefinitions []*PartitionDefinition +} + +// Accept implements Node Accept interface. +func (n *AlterTableSpec) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableSpec) + if n.Constraint != nil { + node, ok := n.Constraint.Accept(v) + if !ok { + return n, false + } + n.Constraint = node.(*Constraint) + } + if n.NewTable != nil { + node, ok := n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + } + for _, col := range n.NewColumns { + node, ok := col.Accept(v) + if !ok { + return n, false + } + col = node.(*ColumnDef) + } + if n.OldColumnName != nil { + node, ok := n.OldColumnName.Accept(v) + if !ok { + return n, false + } + n.OldColumnName = node.(*ColumnName) + } + if n.Position != nil { + node, ok := n.Position.Accept(v) + if !ok { + return n, false + } + n.Position = node.(*ColumnPosition) + } + return v.Leave(n) +} + +// AlterTableStmt is a statement to change the structure of a table. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html +type AlterTableStmt struct { + ddlNode + + Table *TableName + Specs []*AlterTableSpec +} + +// Accept implements Node Accept interface. +func (n *AlterTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.Specs { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Specs[i] = node.(*AlterTableSpec) + } + return v.Leave(n) +} + +// TruncateTableStmt is a statement to empty a table completely. +// See https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html +type TruncateTableStmt struct { + ddlNode + + Table *TableName +} + +// Accept implements Node Accept interface. +func (n *TruncateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TruncateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + Name model.CIStr + LessThan []ExprNode + MaxValue bool + Comment string +} + +// PartitionOptions specifies the partition options. +type PartitionOptions struct { + Tp model.PartitionType + Expr ExprNode + ColumnNames []*ColumnName + Definitions []*PartitionDefinition +} diff --git a/ast/ddl_test.go b/ast/ddl_test.go new file mode 100644 index 000000000..a7fbd0f64 --- /dev/null +++ b/ast/ddl_test.go @@ -0,0 +1,64 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testDDLSuite{}) + +type testDDLSuite struct { +} + +func (ts *testDDLSuite) TestDDLVisitorCover(c *C) { + ce := &checkExpr{} + constraint := &Constraint{Keys: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, Refer: &ReferenceDef{}, Option: &IndexOption{}} + + alterTableSpec := &AlterTableSpec{Constraint: constraint, Options: []*TableOption{{}}, NewTable: &TableName{}, NewColumns: []*ColumnDef{{Name: &ColumnName{}}}, OldColumnName: &ColumnName{}, Position: &ColumnPosition{RelativeColumn: &ColumnName{}}} + + stmts := []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&CreateDatabaseStmt{}, 0, 0}, + {&DropDatabaseStmt{}, 0, 0}, + {&DropIndexStmt{Table: &TableName{}}, 0, 0}, + {&DropTableStmt{Tables: []*TableName{{}, {}}}, 0, 0}, + {&RenameTableStmt{OldTable: &TableName{}, NewTable: &TableName{}}, 0, 0}, + {&TruncateTableStmt{Table: &TableName{}}, 0, 0}, + + // TODO: cover children + {&AlterTableStmt{Table: &TableName{}, Specs: []*AlterTableSpec{alterTableSpec}}, 0, 0}, + {&CreateIndexStmt{Table: &TableName{}}, 0, 0}, + {&CreateTableStmt{Table: &TableName{}, ReferTable: &TableName{}}, 0, 0}, + {&AlterTableSpec{}, 0, 0}, + {&ColumnDef{Name: &ColumnName{}, Options: []*ColumnOption{{Expr: ce}}}, 1, 1}, + {&ColumnOption{Expr: ce}, 1, 1}, + {&ColumnPosition{RelativeColumn: &ColumnName{}}, 0, 0}, + {&Constraint{Keys: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, Refer: &ReferenceDef{}, Option: &IndexOption{}}, 0, 0}, + {&IndexColName{Column: &ColumnName{}}, 0, 0}, + {&ReferenceDef{Table: &TableName{}, IndexColNames: []*IndexColName{{Column: &ColumnName{}}, {Column: &ColumnName{}}}, OnDelete: &OnDeleteOpt{}, OnUpdate: &OnUpdateOpt{}}, 0, 0}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) + c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/ast/dml.go b/ast/dml.go new file mode 100644 index 000000000..2046f3ad2 --- /dev/null +++ b/ast/dml.go @@ -0,0 +1,1037 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +var ( + _ DMLNode = &DeleteStmt{} + _ DMLNode = &InsertStmt{} + _ DMLNode = &UnionStmt{} + _ DMLNode = &UpdateStmt{} + _ DMLNode = &SelectStmt{} + _ DMLNode = &ShowStmt{} + _ DMLNode = &LoadDataStmt{} + + _ Node = &Assignment{} + _ Node = &ByItem{} + _ Node = &FieldList{} + _ Node = &GroupByClause{} + _ Node = &HavingClause{} + _ Node = &Join{} + _ Node = &Limit{} + _ Node = &OnCondition{} + _ Node = &OrderByClause{} + _ Node = &SelectField{} + _ Node = &TableName{} + _ Node = &TableRefsClause{} + _ Node = &TableSource{} + _ Node = &UnionSelectList{} + _ Node = &WildCardField{} +) + +// JoinType is join type, including cross/left/right/full. +type JoinType int + +const ( + // CrossJoin is cross join type. + CrossJoin JoinType = iota + 1 + // LeftJoin is left Join type. + LeftJoin + // RightJoin is right Join type. + RightJoin +) + +// Join represents table join. +type Join struct { + node + resultSetNode + + // Left table can be TableSource or JoinNode. + Left ResultSetNode + // Right table can be TableSource or JoinNode or nil. + Right ResultSetNode + // Tp represents join type. + Tp JoinType + // On represents join on condition. + On *OnCondition + // Using represents join using clause. + Using []*ColumnName + // NaturalJoin represents join is natural join. + NaturalJoin bool + // StraightJoin represents a straight join. + StraightJoin bool +} + +// Accept implements Node Accept interface. +func (n *Join) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Join) + node, ok := n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ResultSetNode) + if n.Right != nil { + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ResultSetNode) + } + if n.On != nil { + node, ok = n.On.Accept(v) + if !ok { + return n, false + } + n.On = node.(*OnCondition) + } + return v.Leave(n) +} + +// TableName represents a table name. +type TableName struct { + node + resultSetNode + + Schema model.CIStr + Name model.CIStr + + DBInfo *model.DBInfo + TableInfo *model.TableInfo + + IndexHints []*IndexHint +} + +// IndexHintType is the type for index hint use, ignore or force. +type IndexHintType int + +// IndexHintUseType values. +const ( + HintUse IndexHintType = 1 + HintIgnore IndexHintType = 2 + HintForce IndexHintType = 3 +) + +// IndexHintScope is the type for index hint for join, order by or group by. +type IndexHintScope int + +// Index hint scopes. +const ( + HintForScan IndexHintScope = 1 + HintForJoin IndexHintScope = 2 + HintForOrderBy IndexHintScope = 3 + HintForGroupBy IndexHintScope = 4 +) + +// IndexHint represents a hint for optimizer to use/ignore/force for join/order by/group by. +type IndexHint struct { + IndexNames []model.CIStr + HintType IndexHintType + HintScope IndexHintScope +} + +// Accept implements Node Accept interface. +func (n *TableName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableName) + return v.Leave(n) +} + +// DeleteTableList is the tablelist used in delete statement multi-table mode. +type DeleteTableList struct { + node + Tables []*TableName +} + +// Accept implements Node Accept interface. +func (n *DeleteTableList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeleteTableList) + if n != nil { + for i, t := range n.Tables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + } + return v.Leave(n) +} + +// OnCondition represents JOIN on condition. +type OnCondition struct { + node + + Expr ExprNode +} + +// Accept implements Node Accept interface. +func (n *OnCondition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnCondition) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TableSource represents table source with a name. +type TableSource struct { + node + + // Source is the source of the data, can be a TableName, + // a SelectStmt, a UnionStmt, or a JoinNode. + Source ResultSetNode + + // AsName is the alias name of the table source. + AsName model.CIStr +} + +// Accept implements Node Accept interface. +func (n *TableSource) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableSource) + node, ok := n.Source.Accept(v) + if !ok { + return n, false + } + n.Source = node.(ResultSetNode) + return v.Leave(n) +} + +// SelectLockType is the lock type for SelectStmt. +type SelectLockType int + +// Select lock types. +const ( + SelectLockNone SelectLockType = iota + SelectLockForUpdate + SelectLockInShareMode +) + +// String implements fmt.Stringer. +func (slt SelectLockType) String() string { + switch slt { + case SelectLockNone: + return "none" + case SelectLockForUpdate: + return "for update" + case SelectLockInShareMode: + return "in share mode" + } + return "unsupported select lock type" +} + +// WildCardField is a special type of select field content. +type WildCardField struct { + node + + Table model.CIStr + Schema model.CIStr +} + +// Accept implements Node Accept interface. +func (n *WildCardField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WildCardField) + return v.Leave(n) +} + +// SelectField represents fields in select statement. +// There are two type of select field: wildcard +// and expression with optional alias name. +type SelectField struct { + node + + // Offset is used to get original text. + Offset int + // WildCard is not nil, Expr will be nil. + WildCard *WildCardField + // Expr is not nil, WildCard will be nil. + Expr ExprNode + // AsName is alias name for Expr. + AsName model.CIStr + // Auxiliary stands for if this field is auxiliary. + // When we add a Field into SelectField list which is used for having/orderby clause but the field is not in select clause, + // we should set its Auxiliary to true. Then the TrimExec will trim the field. + Auxiliary bool +} + +// Accept implements Node Accept interface. +func (n *SelectField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SelectField) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// FieldList represents field list in select statement. +type FieldList struct { + node + + Fields []*SelectField +} + +// Accept implements Node Accept interface. +func (n *FieldList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FieldList) + for i, val := range n.Fields { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Fields[i] = node.(*SelectField) + } + return v.Leave(n) +} + +// TableRefsClause represents table references clause in dml statement. +type TableRefsClause struct { + node + + TableRefs *Join +} + +// Accept implements Node Accept interface. +func (n *TableRefsClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableRefsClause) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*Join) + return v.Leave(n) +} + +// ByItem represents an item in order by or group by. +type ByItem struct { + node + + Expr ExprNode + Desc bool +} + +// Accept implements Node Accept interface. +func (n *ByItem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ByItem) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// GroupByClause represents group by clause. +type GroupByClause struct { + node + Items []*ByItem +} + +// Accept implements Node Accept interface. +func (n *GroupByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GroupByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// HavingClause represents having clause. +type HavingClause struct { + node + Expr ExprNode +} + +// Accept implements Node Accept interface. +func (n *HavingClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*HavingClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// OrderByClause represents order by clause. +type OrderByClause struct { + node + Items []*ByItem + ForUnion bool +} + +// Accept implements Node Accept interface. +func (n *OrderByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OrderByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// SelectStmt represents the select query node. +// See https://dev.mysql.com/doc/refman/5.7/en/select.html +type SelectStmt struct { + dmlNode + resultSetNode + + // SelectStmtOpts wraps around select hints and switches. + *SelectStmtOpts + // Distinct represents whether the select has distinct option. + Distinct bool + // From is the from clause of the query. + From *TableRefsClause + // Where is the where clause in select statement. + Where ExprNode + // Fields is the select expression list. + Fields *FieldList + // GroupBy is the group by expression list. + GroupBy *GroupByClause + // Having is the having condition. + Having *HavingClause + // OrderBy is the ordering expression list. + OrderBy *OrderByClause + // Limit is the limit clause. + Limit *Limit + // LockTp is the lock type + LockTp SelectLockType + // TableHints represents the table level Optimizer Hint for join type + TableHints []*TableOptimizerHint + // IsAfterUnionDistinct indicates whether it's a stmt after "union distinct". + IsAfterUnionDistinct bool + // IsInBraces indicates whether it's a stmt in brace. + IsInBraces bool +} + +// Accept implements Node Accept interface. +func (n *SelectStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*SelectStmt) + if n.TableHints != nil && len(n.TableHints) != 0 { + newHints := make([]*TableOptimizerHint, len(n.TableHints)) + for i, hint := range n.TableHints { + node, ok := hint.Accept(v) + if !ok { + return n, false + } + newHints[i] = node.(*TableOptimizerHint) + } + n.TableHints = newHints + } + + if n.From != nil { + node, ok := n.From.Accept(v) + if !ok { + return n, false + } + n.From = node.(*TableRefsClause) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + + if n.Fields != nil { + node, ok := n.Fields.Accept(v) + if !ok { + return n, false + } + n.Fields = node.(*FieldList) + } + + if n.GroupBy != nil { + node, ok := n.GroupBy.Accept(v) + if !ok { + return n, false + } + n.GroupBy = node.(*GroupByClause) + } + + if n.Having != nil { + node, ok := n.Having.Accept(v) + if !ok { + return n, false + } + n.Having = node.(*HavingClause) + } + + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + + return v.Leave(n) +} + +// UnionSelectList represents the select list in a union statement. +type UnionSelectList struct { + node + + Selects []*SelectStmt +} + +// Accept implements Node Accept interface. +func (n *UnionSelectList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnionSelectList) + for i, sel := range n.Selects { + node, ok := sel.Accept(v) + if !ok { + return n, false + } + n.Selects[i] = node.(*SelectStmt) + } + return v.Leave(n) +} + +// UnionStmt represents "union statement" +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +type UnionStmt struct { + dmlNode + resultSetNode + + SelectList *UnionSelectList + OrderBy *OrderByClause + Limit *Limit +} + +// Accept implements Node Accept interface. +func (n *UnionStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnionStmt) + if n.SelectList != nil { + node, ok := n.SelectList.Accept(v) + if !ok { + return n, false + } + n.SelectList = node.(*UnionSelectList) + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Assignment is the expression for assignment, like a = 1. +type Assignment struct { + node + // Column is the column name to be assigned. + Column *ColumnName + // Expr is the expression assigning to ColName. + Expr ExprNode +} + +// Accept implements Node Accept interface. +func (n *Assignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Assignment) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + node, ok = n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// LoadDataStmt is a statement to load data from a specified file, then insert this rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/load-data.html +type LoadDataStmt struct { + dmlNode + + IsLocal bool + Path string + Table *TableName + Columns []*ColumnName + FieldsInfo *FieldsClause + LinesInfo *LinesClause + IgnoreLines uint64 +} + +// Accept implements Node Accept interface. +func (n *LoadDataStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadDataStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// FieldsClause represents fields references clause in load data statement. +type FieldsClause struct { + Terminated string + Enclosed byte + Escaped byte +} + +// LinesClause represents lines references clause in load data statement. +type LinesClause struct { + Starting string + Terminated string +} + +// InsertStmt is a statement to insert new rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +type InsertStmt struct { + dmlNode + + IsReplace bool + IgnoreErr bool + Table *TableRefsClause + Columns []*ColumnName + Lists [][]ExprNode + Setlist []*Assignment + Priority mysql.PriorityEnum + OnDuplicate []*Assignment + Select ResultSetNode +} + +// Accept implements Node Accept interface. +func (n *InsertStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*InsertStmt) + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableRefsClause) + + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + for i, list := range n.Lists { + for j, val := range list { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Lists[i][j] = node.(ExprNode) + } + } + for i, val := range n.Setlist { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Setlist[i] = node.(*Assignment) + } + for i, val := range n.OnDuplicate { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.OnDuplicate[i] = node.(*Assignment) + } + return v.Leave(n) +} + +// DeleteStmt is a statement to delete rows from table. +// See https://dev.mysql.com/doc/refman/5.7/en/delete.html +type DeleteStmt struct { + dmlNode + + // TableRefs is used in both single table and multiple table delete statement. + TableRefs *TableRefsClause + // Tables is only used in multiple table delete statement. + Tables *DeleteTableList + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + Quick bool + IsMultiTable bool + BeforeFrom bool + // TableHints represents the table level Optimizer Hint for join type. + TableHints []*TableOptimizerHint +} + +// Accept implements Node Accept interface. +func (n *DeleteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*DeleteStmt) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + + node, ok = n.Tables.Accept(v) + if !ok { + return n, false + } + n.Tables = node.(*DeleteTableList) + + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// UpdateStmt is a statement to update columns of existing rows in tables with new values. +// See https://dev.mysql.com/doc/refman/5.7/en/update.html +type UpdateStmt struct { + dmlNode + + TableRefs *TableRefsClause + List []*Assignment + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + MultipleTable bool + TableHints []*TableOptimizerHint +} + +// Accept implements Node Accept interface. +func (n *UpdateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UpdateStmt) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(*Assignment) + } + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Limit is the limit clause. +type Limit struct { + node + + Count ExprNode + Offset ExprNode +} + +// Accept implements Node Accept interface. +func (n *Limit) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + if n.Count != nil { + node, ok := n.Count.Accept(v) + if !ok { + return n, false + } + n.Count = node.(ExprNode) + } + if n.Offset != nil { + node, ok := n.Offset.Accept(v) + if !ok { + return n, false + } + n.Offset = node.(ExprNode) + } + + n = newNode.(*Limit) + return v.Leave(n) +} + +// ShowStmtType is the type for SHOW statement. +type ShowStmtType int + +// Show statement types. +const ( + ShowNone = iota + ShowEngines + ShowDatabases + ShowTables + ShowTableStatus + ShowColumns + ShowWarnings + ShowCharset + ShowVariables + ShowStatus + ShowCollation + ShowCreateTable + ShowGrants + ShowTriggers + ShowProcedureStatus + ShowIndex + ShowProcessList + ShowCreateDatabase + ShowEvents + ShowStatsMeta + ShowStatsHistograms + ShowStatsBuckets + ShowStatsHealthy + ShowPlugins + ShowProfiles + ShowMasterStatus + ShowPrivileges + ShowErrors +) + +// ShowStmt is a statement to provide information about databases, tables, columns and so on. +// See https://dev.mysql.com/doc/refman/5.7/en/show.html +type ShowStmt struct { + dmlNode + resultSetNode + + Tp ShowStmtType // Databases/Tables/Columns/.... + DBName string + Table *TableName // Used for showing columns. + Column *ColumnName // Used for `desc table column`. + Flag int // Some flag parsed from sql, such as FULL. + Full bool + User *auth.UserIdentity // Used for show grants. + + // GlobalScope is used by show variables + GlobalScope bool + Pattern *PatternLikeExpr + Where ExprNode +} + +// Accept implements Node Accept interface. +func (n *ShowStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ShowStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + if n.Column != nil { + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(*PatternLikeExpr) + } + + switch n.Tp { + case ShowTriggers, ShowProcedureStatus, ShowProcessList, ShowEvents: + // We don't have any data to return for those types, + // but visiting Where may cause resolving error, so return here to avoid error. + return v.Leave(n) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + return v.Leave(n) +} diff --git a/ast/dml_test.go b/ast/dml_test.go new file mode 100644 index 000000000..6553c3254 --- /dev/null +++ b/ast/dml_test.go @@ -0,0 +1,70 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testDMLSuite{}) + +type testDMLSuite struct { +} + +func (ts *testDMLSuite) TestDMLVisitorCover(c *C) { + ce := &checkExpr{} + + tableRefsClause := &TableRefsClause{TableRefs: &Join{Left: &TableSource{Source: &TableName{}}, On: &OnCondition{Expr: ce}}} + + stmts := []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&DeleteStmt{TableRefs: tableRefsClause, Tables: &DeleteTableList{}, Where: ce, + Order: &OrderByClause{}, Limit: &Limit{Count: ce, Offset: ce}}, 4, 4}, + {&ShowStmt{Table: &TableName{}, Column: &ColumnName{}, Pattern: &PatternLikeExpr{Expr: ce, Pattern: ce}, Where: ce}, 3, 3}, + {&LoadDataStmt{Table: &TableName{}, Columns: []*ColumnName{{}}, FieldsInfo: &FieldsClause{}, LinesInfo: &LinesClause{}}, 0, 0}, + {&Assignment{Column: &ColumnName{}, Expr: ce}, 1, 1}, + {&ByItem{Expr: ce}, 1, 1}, + {&GroupByClause{Items: []*ByItem{{Expr: ce}, {Expr: ce}}}, 2, 2}, + {&HavingClause{Expr: ce}, 1, 1}, + {&Join{Left: &TableSource{Source: &TableName{}}}, 0, 0}, + {&Limit{Count: ce, Offset: ce}, 2, 2}, + {&OnCondition{Expr: ce}, 1, 1}, + {&OrderByClause{Items: []*ByItem{{Expr: ce}, {Expr: ce}}}, 2, 2}, + {&SelectField{Expr: ce, WildCard: &WildCardField{}}, 1, 1}, + {&TableName{}, 0, 0}, + {tableRefsClause, 1, 1}, + {&TableSource{Source: &TableName{}}, 0, 0}, + {&WildCardField{}, 0, 0}, + + // TODO: cover childrens + {&InsertStmt{Table: tableRefsClause}, 1, 1}, + {&UnionStmt{}, 0, 0}, + {&UpdateStmt{TableRefs: tableRefsClause}, 1, 1}, + {&SelectStmt{}, 0, 0}, + {&FieldList{}, 0, 0}, + {&UnionSelectList{}, 0, 0}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) + c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/ast/expressions.go b/ast/expressions.go new file mode 100644 index 000000000..e81f87876 --- /dev/null +++ b/ast/expressions.go @@ -0,0 +1,914 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "io" + "regexp" + "strings" + + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" +) + +var ( + _ ExprNode = &BetweenExpr{} + _ ExprNode = &BinaryOperationExpr{} + _ ExprNode = &CaseExpr{} + _ ExprNode = &ColumnNameExpr{} + _ ExprNode = &CompareSubqueryExpr{} + _ ExprNode = &DefaultExpr{} + _ ExprNode = &ExistsSubqueryExpr{} + _ ExprNode = &IsNullExpr{} + _ ExprNode = &IsTruthExpr{} + _ ExprNode = &ParenthesesExpr{} + _ ExprNode = &PatternInExpr{} + _ ExprNode = &PatternLikeExpr{} + _ ExprNode = &PatternRegexpExpr{} + _ ExprNode = &PositionExpr{} + _ ExprNode = &RowExpr{} + _ ExprNode = &SubqueryExpr{} + _ ExprNode = &UnaryOperationExpr{} + _ ExprNode = &ValuesExpr{} + _ ExprNode = &VariableExpr{} + + _ Node = &ColumnName{} + _ Node = &WhenClause{} +) + +// ValueExpr define a interface for ValueExpr. +type ValueExpr interface { + ExprNode + SetValue(val interface{}) + GetValue() interface{} + GetDatumString() string + GetString() string + GetProjectionOffset() int + SetProjectionOffset(offset int) +} + +// NewValueExpr creates a ValueExpr with value, and sets default field type. +var NewValueExpr func(interface{}) ValueExpr + +// NewParamMarkerExpr creates a ParamMarkerExpr. +var NewParamMarkerExpr func(offset int) ParamMarkerExpr + +// BetweenExpr is for "between and" or "not between and" expression. +type BetweenExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Left is the expression for minimal value in the range. + Left ExprNode + // Right is the expression for maximum value in the range. + Right ExprNode + // Not is true, the expression is "not between and". + Not bool +} + +// Format the ExprNode into a Writer. +func (n *BetweenExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT BETWEEN ") + } else { + fmt.Fprint(w, " BETWEEN ") + } + n.Left.Format(w) + fmt.Fprint(w, " AND ") + n.Right.Format(w) +} + +// Accept implements Node interface. +func (n *BetweenExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BetweenExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ExprNode) + + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ExprNode) + + return v.Leave(n) +} + +// BinaryOperationExpr is for binary operation like `1 + 1`, `1 - 1`, etc. +type BinaryOperationExpr struct { + exprNode + // Op is the operator code for BinaryOperation. + Op opcode.Op + // L is the left expression in BinaryOperation. + L ExprNode + // R is the right expression in BinaryOperation. + R ExprNode +} + +// Format the ExprNode into a Writer. +func (n *BinaryOperationExpr) Format(w io.Writer) { + n.L.Format(w) + fmt.Fprint(w, " ") + n.Op.Format(w) + fmt.Fprint(w, " ") + n.R.Format(w) +} + +// Accept implements Node interface. +func (n *BinaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BinaryOperationExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + + return v.Leave(n) +} + +// WhenClause is the when clause in Case expression for "when condition then result". +type WhenClause struct { + node + // Expr is the condition expression in WhenClause. + Expr ExprNode + // Result is the result expression in WhenClause. + Result ExprNode +} + +// Accept implements Node Accept interface. +func (n *WhenClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*WhenClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Result.Accept(v) + if !ok { + return n, false + } + n.Result = node.(ExprNode) + return v.Leave(n) +} + +// CaseExpr is the case expression. +type CaseExpr struct { + exprNode + // Value is the compare value expression. + Value ExprNode + // WhenClauses is the condition check expression. + WhenClauses []*WhenClause + // ElseClause is the else result expression. + ElseClause ExprNode +} + +// Format the ExprNode into a Writer. +func (n *CaseExpr) Format(w io.Writer) { + fmt.Fprint(w, "CASE ") + // Because the presence of `case when` syntax, `Value` could be nil and we need check this. + if n.Value != nil { + n.Value.Format(w) + fmt.Fprint(w, " ") + } + for _, clause := range n.WhenClauses { + fmt.Fprint(w, "WHEN ") + clause.Expr.Format(w) + fmt.Fprint(w, " THEN ") + clause.Result.Format(w) + } + if n.ElseClause != nil { + fmt.Fprint(w, " ELSE ") + n.ElseClause.Format(w) + } + fmt.Fprint(w, " END") +} + +// Accept implements Node Accept interface. +func (n *CaseExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*CaseExpr) + if n.Value != nil { + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + } + for i, val := range n.WhenClauses { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.WhenClauses[i] = node.(*WhenClause) + } + if n.ElseClause != nil { + node, ok := n.ElseClause.Accept(v) + if !ok { + return n, false + } + n.ElseClause = node.(ExprNode) + } + return v.Leave(n) +} + +// SubqueryExpr represents a subquery. +type SubqueryExpr struct { + exprNode + // Query is the query SelectNode. + Query ResultSetNode + Evaluated bool + Correlated bool + MultiRows bool + Exists bool +} + +// Format the ExprNode into a Writer. +func (n *SubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *SubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SubqueryExpr) + node, ok := n.Query.Accept(v) + if !ok { + return n, false + } + n.Query = node.(ResultSetNode) + return v.Leave(n) +} + +// CompareSubqueryExpr is the expression for "expr cmp (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/comparisons-using-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html +type CompareSubqueryExpr struct { + exprNode + // L is the left expression + L ExprNode + // Op is the comparison opcode. + Op opcode.Op + // R is the subquery for right expression, may be rewritten to other type of expression. + R ExprNode + // All is true, we should compare all records in subquery. + All bool +} + +// Format the ExprNode into a Writer. +func (n *CompareSubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *CompareSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CompareSubqueryExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + return v.Leave(n) +} + +// ColumnName represents column name. +type ColumnName struct { + node + Schema model.CIStr + Table model.CIStr + Name model.CIStr +} + +// Accept implements Node Accept interface. +func (n *ColumnName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnName) + return v.Leave(n) +} + +// String implements Stringer interface. +func (n *ColumnName) String() string { + result := n.Name.L + if n.Table.L != "" { + result = n.Table.L + "." + result + } + if n.Schema.L != "" { + result = n.Schema.L + "." + result + } + return result +} + +// OrigColName returns the full original column name. +func (n *ColumnName) OrigColName() (ret string) { + ret = n.Name.O + if n.Table.O == "" { + return + } + ret = n.Table.O + "." + ret + if n.Schema.O == "" { + return + } + ret = n.Schema.O + "." + ret + return +} + +// ColumnNameExpr represents a column name expression. +type ColumnNameExpr struct { + exprNode + + // Name is the referenced column name. + Name *ColumnName + + // Refer is the result field the column name refers to. + // The value of Refer.Expr is used as the value of the expression. + Refer *ResultField +} + +// Format the ExprNode into a Writer. +func (n *ColumnNameExpr) Format(w io.Writer) { + name := strings.Replace(n.Name.String(), ".", "`.`", -1) + fmt.Fprintf(w, "`%s`", name) +} + +// Accept implements Node Accept interface. +func (n *ColumnNameExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnNameExpr) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + return v.Leave(n) +} + +// DefaultExpr is the default expression using default value for a column. +type DefaultExpr struct { + exprNode + // Name is the column name. + Name *ColumnName +} + +// Format the ExprNode into a Writer. +func (n *DefaultExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *DefaultExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DefaultExpr) + if n.Name != nil { + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + } + return v.Leave(n) +} + +// ExistsSubqueryExpr is the expression for "exists (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html +type ExistsSubqueryExpr struct { + exprNode + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode + // Not is true, the expression is "not exists". + Not bool +} + +// Format the ExprNode into a Writer. +func (n *ExistsSubqueryExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ExistsSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExistsSubqueryExpr) + node, ok := n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + return v.Leave(n) +} + +// PatternInExpr is the expression for in operator, like "expr in (1, 2, 3)" or "expr in (select c from t)". +type PatternInExpr struct { + exprNode + // Expr is the value expression to be compared. + Expr ExprNode + // List is the list expression in compare list. + List []ExprNode + // Not is true, the expression is "not in". + Not bool + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode +} + +// Format the ExprNode into a Writer. +func (n *PatternInExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT IN (") + } else { + fmt.Fprint(w, " IN (") + } + for i, expr := range n.List { + expr.Format(w) + if i != len(n.List)-1 { + fmt.Fprint(w, ",") + } + } + fmt.Fprint(w, ")") +} + +// Accept implements Node Accept interface. +func (n *PatternInExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternInExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(ExprNode) + } + if n.Sel != nil { + node, ok = n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + } + return v.Leave(n) +} + +// IsNullExpr is the expression for null check. +type IsNullExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not null". + Not bool +} + +// Format the ExprNode into a Writer. +func (n *IsNullExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " IS NOT NULL") + return + } + fmt.Fprint(w, " IS NULL") +} + +// Accept implements Node Accept interface. +func (n *IsNullExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsNullExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// IsTruthExpr is the expression for true/false check. +type IsTruthExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not true/false". + Not bool + // True indicates checking true or false. + True int64 +} + +// Format the ExprNode into a Writer. +func (n *IsTruthExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " IS NOT") + } else { + fmt.Fprint(w, " IS") + } + if n.True > 0 { + fmt.Fprint(w, " TRUE") + } else { + fmt.Fprint(w, " FALSE") + } +} + +// Accept implements Node Accept interface. +func (n *IsTruthExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsTruthExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// PatternLikeExpr is the expression for like operator, e.g, expr like "%123%" +type PatternLikeExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the like expression. + Pattern ExprNode + // Not is true, the expression is "not like". + Not bool + + Escape byte + + PatChars []byte + PatTypes []byte +} + +// Format the ExprNode into a Writer. +func (n *PatternLikeExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT LIKE ") + } else { + fmt.Fprint(w, " LIKE ") + } + n.Pattern.Format(w) + if n.Escape != '\\' { + fmt.Fprint(w, " ESCAPE ") + fmt.Fprintf(w, "'%c'", n.Escape) + } +} + +// Accept implements Node Accept interface. +func (n *PatternLikeExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternLikeExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + } + return v.Leave(n) +} + +// ParamMarkerExpr expression holds a place for another expression. +// Used in parsing prepare statement. +type ParamMarkerExpr interface { + ValueExpr + SetOrder(int) +} + +// ParenthesesExpr is the parentheses expression. +type ParenthesesExpr struct { + exprNode + // Expr is the expression in parentheses. + Expr ExprNode +} + +// Format the ExprNode into a Writer. +func (n *ParenthesesExpr) Format(w io.Writer) { + fmt.Fprint(w, "(") + n.Expr.Format(w) + fmt.Fprint(w, ")") +} + +// Accept implements Node Accept interface. +func (n *ParenthesesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ParenthesesExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// PositionExpr is the expression for order by and group by position. +// MySQL use position expression started from 1, it looks a little confused inner. +// maybe later we will use 0 at first. +type PositionExpr struct { + exprNode + // N is the position, started from 1 now. + N int + // Refer is the result field the position refers to. + Refer *ResultField +} + +// Format the ExprNode into a Writer. +func (n *PositionExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *PositionExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PositionExpr) + return v.Leave(n) +} + +// PatternRegexpExpr is the pattern expression for pattern match. +type PatternRegexpExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the expression for pattern. + Pattern ExprNode + // Not is true, the expression is "not rlike", + Not bool + + // Re is the compiled regexp. + Re *regexp.Regexp + // Sexpr is the string for Expr expression. + Sexpr *string +} + +// Format the ExprNode into a Writer. +func (n *PatternRegexpExpr) Format(w io.Writer) { + n.Expr.Format(w) + if n.Not { + fmt.Fprint(w, " NOT REGEXP ") + } else { + fmt.Fprint(w, " REGEXP ") + } + n.Pattern.Format(w) +} + +// Accept implements Node Accept interface. +func (n *PatternRegexpExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternRegexpExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + node, ok = n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + return v.Leave(n) +} + +// RowExpr is the expression for row constructor. +// See https://dev.mysql.com/doc/refman/5.7/en/row-subqueries.html +type RowExpr struct { + exprNode + + Values []ExprNode +} + +// Format the ExprNode into a Writer. +func (n *RowExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *RowExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RowExpr) + for i, val := range n.Values { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Values[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// UnaryOperationExpr is the expression for unary operator. +type UnaryOperationExpr struct { + exprNode + // Op is the operator opcode. + Op opcode.Op + // V is the unary expression. + V ExprNode +} + +// Format the ExprNode into a Writer. +func (n *UnaryOperationExpr) Format(w io.Writer) { + n.Op.Format(w) + n.V.Format(w) +} + +// Accept implements Node Accept interface. +func (n *UnaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnaryOperationExpr) + node, ok := n.V.Accept(v) + if !ok { + return n, false + } + n.V = node.(ExprNode) + return v.Leave(n) +} + +// ValuesExpr is the expression used in INSERT VALUES. +type ValuesExpr struct { + exprNode + // Column is column name. + Column *ColumnNameExpr +} + +// Format the ExprNode into a Writer. +func (n *ValuesExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ValuesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ValuesExpr) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + // `node` may be *ast.ValueExpr, to avoid panic, we write `ok` but do not use + // it. + n.Column, ok = node.(*ColumnNameExpr) + return v.Leave(n) +} + +// VariableExpr is the expression for variable. +type VariableExpr struct { + exprNode + // Name is the variable name. + Name string + // IsGlobal indicates whether this variable is global. + IsGlobal bool + // IsSystem indicates whether this variable is a system variable in current session. + IsSystem bool + // ExplicitScope indicates whether this variable scope is set explicitly. + ExplicitScope bool + // Value is the variable value. + Value ExprNode +} + +// Format the ExprNode into a Writer. +func (n *VariableExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *VariableExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableExpr) + if n.Value == nil { + return v.Leave(n) + } + + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// MaxValueExpr is the expression for "maxvalue" used in partition. +type MaxValueExpr struct { + exprNode +} + +// Format the ExprNode into a Writer. +func (n *MaxValueExpr) Format(w io.Writer) { + fmt.Fprint(w, "MAXVALUE") +} + +// Accept implements Node Accept interface. +func (n *MaxValueExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} diff --git a/ast/expressions_test.go b/ast/expressions_test.go new file mode 100644 index 000000000..80ce65d6e --- /dev/null +++ b/ast/expressions_test.go @@ -0,0 +1,103 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" + _ "github.com/pingcap/tidb/types/parser_driver" +) + +var _ = Suite(&testExpressionsSuite{}) + +type testExpressionsSuite struct { +} + +type checkVisitor struct{} + +func (v checkVisitor) Enter(in Node) (Node, bool) { + if e, ok := in.(*checkExpr); ok { + e.enterCnt++ + return in, true + } + return in, false +} + +func (v checkVisitor) Leave(in Node) (Node, bool) { + if e, ok := in.(*checkExpr); ok { + e.leaveCnt++ + } + return in, true +} + +type checkExpr struct { + ValueExpr + + enterCnt int + leaveCnt int +} + +func (n *checkExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*checkExpr) + return v.Leave(n) +} + +func (n *checkExpr) reset() { + n.enterCnt = 0 + n.leaveCnt = 0 +} + +func (tc *testExpressionsSuite) TestExpresionsVisitorCover(c *C) { + ce := &checkExpr{} + stmts := + []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&BetweenExpr{Expr: ce, Left: ce, Right: ce}, 3, 3}, + {&BinaryOperationExpr{L: ce, R: ce}, 2, 2}, + {&CaseExpr{Value: ce, WhenClauses: []*WhenClause{{Expr: ce, Result: ce}, + {Expr: ce, Result: ce}}, ElseClause: ce}, 6, 6}, + {&ColumnNameExpr{Name: &ColumnName{}}, 0, 0}, + {&CompareSubqueryExpr{L: ce, R: ce}, 2, 2}, + {&DefaultExpr{Name: &ColumnName{}}, 0, 0}, + {&ExistsSubqueryExpr{Sel: ce}, 1, 1}, + {&IsNullExpr{Expr: ce}, 1, 1}, + {&IsTruthExpr{Expr: ce}, 1, 1}, + {NewParamMarkerExpr(0), 0, 0}, + {&ParenthesesExpr{Expr: ce}, 1, 1}, + {&PatternInExpr{Expr: ce, List: []ExprNode{ce, ce, ce}, Sel: ce}, 5, 5}, + {&PatternLikeExpr{Expr: ce, Pattern: ce}, 2, 2}, + {&PatternRegexpExpr{Expr: ce, Pattern: ce}, 2, 2}, + {&PositionExpr{}, 0, 0}, + {&RowExpr{Values: []ExprNode{ce, ce}}, 2, 2}, + {&UnaryOperationExpr{V: ce}, 1, 1}, + {NewValueExpr(0), 0, 0}, + {&ValuesExpr{Column: &ColumnNameExpr{Name: &ColumnName{}}}, 0, 0}, + {&VariableExpr{Value: ce}, 1, 1}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) + c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/ast/flag.go b/ast/flag.go new file mode 100644 index 000000000..773a2b444 --- /dev/null +++ b/ast/flag.go @@ -0,0 +1,156 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +// HasAggFlag checks if the expr contains FlagHasAggregateFunc. +func HasAggFlag(expr ExprNode) bool { + return expr.GetFlag()&FlagHasAggregateFunc > 0 +} + +// SetFlag sets flag for expression. +func SetFlag(n Node) { + var setter flagSetter + n.Accept(&setter) +} + +type flagSetter struct { +} + +func (f *flagSetter) Enter(in Node) (Node, bool) { + return in, false +} + +func (f *flagSetter) Leave(in Node) (Node, bool) { + if x, ok := in.(ParamMarkerExpr); ok { + x.SetFlag(FlagHasParamMarker) + } + switch x := in.(type) { + case *AggregateFuncExpr: + f.aggregateFunc(x) + case *BetweenExpr: + x.SetFlag(x.Expr.GetFlag() | x.Left.GetFlag() | x.Right.GetFlag()) + case *BinaryOperationExpr: + x.SetFlag(x.L.GetFlag() | x.R.GetFlag()) + case *CaseExpr: + f.caseExpr(x) + case *ColumnNameExpr: + x.SetFlag(FlagHasReference) + case *CompareSubqueryExpr: + x.SetFlag(x.L.GetFlag() | x.R.GetFlag()) + case *DefaultExpr: + x.SetFlag(FlagHasDefault) + case *ExistsSubqueryExpr: + x.SetFlag(x.Sel.GetFlag()) + case *FuncCallExpr: + f.funcCall(x) + case *FuncCastExpr: + x.SetFlag(FlagHasFunc | x.Expr.GetFlag()) + case *IsNullExpr: + x.SetFlag(x.Expr.GetFlag()) + case *IsTruthExpr: + x.SetFlag(x.Expr.GetFlag()) + case *ParenthesesExpr: + x.SetFlag(x.Expr.GetFlag()) + case *PatternInExpr: + f.patternIn(x) + case *PatternLikeExpr: + f.patternLike(x) + case *PatternRegexpExpr: + f.patternRegexp(x) + case *PositionExpr: + x.SetFlag(FlagHasReference) + case *RowExpr: + f.row(x) + case *SubqueryExpr: + x.SetFlag(FlagHasSubquery) + case *UnaryOperationExpr: + x.SetFlag(x.V.GetFlag()) + case *ValuesExpr: + x.SetFlag(FlagHasReference) + case *VariableExpr: + if x.Value == nil { + x.SetFlag(FlagHasVariable) + } else { + x.SetFlag(FlagHasVariable | x.Value.GetFlag()) + } + } + + return in, true +} + +func (f *flagSetter) caseExpr(x *CaseExpr) { + var flag uint64 + if x.Value != nil { + flag |= x.Value.GetFlag() + } + for _, val := range x.WhenClauses { + flag |= val.Expr.GetFlag() + flag |= val.Result.GetFlag() + } + if x.ElseClause != nil { + flag |= x.ElseClause.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternIn(x *PatternInExpr) { + flag := x.Expr.GetFlag() + for _, val := range x.List { + flag |= val.GetFlag() + } + if x.Sel != nil { + flag |= x.Sel.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternLike(x *PatternLikeExpr) { + flag := x.Pattern.GetFlag() + if x.Expr != nil { + flag |= x.Expr.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) patternRegexp(x *PatternRegexpExpr) { + flag := x.Pattern.GetFlag() + if x.Expr != nil { + flag |= x.Expr.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) row(x *RowExpr) { + var flag uint64 + for _, val := range x.Values { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) funcCall(x *FuncCallExpr) { + flag := FlagHasFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} + +func (f *flagSetter) aggregateFunc(x *AggregateFuncExpr) { + flag := FlagHasAggregateFunc + for _, val := range x.Args { + flag |= val.GetFlag() + } + x.SetFlag(flag) +} diff --git a/ast/flag_test.go b/ast/flag_test.go new file mode 100644 index 000000000..fc7f773d4 --- /dev/null +++ b/ast/flag_test.go @@ -0,0 +1,153 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testFlagSuite{}) + +type testFlagSuite struct { + *parser.Parser +} + +func (ts *testFlagSuite) SetUpSuite(c *C) { + ts.Parser = parser.New() +} + +func (ts *testFlagSuite) TestHasAggFlag(c *C) { + expr := &ast.BetweenExpr{} + flagTests := []struct { + flag uint64 + hasAgg bool + }{ + {ast.FlagHasAggregateFunc, true}, + {ast.FlagHasAggregateFunc | ast.FlagHasVariable, true}, + {ast.FlagHasVariable, false}, + } + for _, tt := range flagTests { + expr.SetFlag(tt.flag) + c.Assert(ast.HasAggFlag(expr), Equals, tt.hasAgg) + } +} + +func (ts *testFlagSuite) TestFlag(c *C) { + flagTests := []struct { + expr string + flag uint64 + }{ + { + "1 between 0 and 2", + ast.FlagConstant, + }, + { + "case 1 when 1 then 1 else 0 end", + ast.FlagConstant, + }, + { + "case 1 when 1 then 1 else 0 end", + ast.FlagConstant, + }, + { + "case 1 when a > 1 then 1 else 0 end", + ast.FlagConstant | ast.FlagHasReference, + }, + { + "1 = ANY (select 1) OR exists (select 1)", + ast.FlagHasSubquery, + }, + { + "1 in (1) or 1 is true or null is null or 'abc' like 'abc' or 'abc' rlike 'abc'", + ast.FlagConstant, + }, + { + "row (1, 1) = row (1, 1)", + ast.FlagConstant, + }, + { + "(1 + a) > ?", + ast.FlagHasReference | ast.FlagHasParamMarker, + }, + { + "trim('abc ')", + ast.FlagHasFunc, + }, + { + "now() + EXTRACT(YEAR FROM '2009-07-02') + CAST(1 AS UNSIGNED)", + ast.FlagHasFunc, + }, + { + "substring('abc', 1)", + ast.FlagHasFunc, + }, + { + "sum(a)", + ast.FlagHasAggregateFunc | ast.FlagHasReference, + }, + { + "(select 1) as a", + ast.FlagHasSubquery, + }, + { + "@auto_commit", + ast.FlagHasVariable, + }, + { + "default(a)", + ast.FlagHasDefault, + }, + { + "a is null", + ast.FlagHasReference, + }, + { + "1 is true", + ast.FlagConstant, + }, + { + "a in (1, count(*), 3)", + ast.FlagConstant | ast.FlagHasReference | ast.FlagHasAggregateFunc, + }, + { + "'Michael!' REGEXP '.*'", + ast.FlagConstant, + }, + { + "a REGEXP '.*'", + ast.FlagHasReference, + }, + { + "-a", + ast.FlagHasReference, + }, + } + for _, tt := range flagTests { + stmt, err := ts.ParseOneStmt("select "+tt.expr, "", "") + c.Assert(err, IsNil) + selectStmt := stmt.(*ast.SelectStmt) + ast.SetFlag(selectStmt) + expr := selectStmt.Fields.Fields[0].Expr + c.Assert(expr.GetFlag(), Equals, tt.flag, Commentf("For %s", tt.expr)) + } +} diff --git a/ast/format_test.go b/ast/format_test.go new file mode 100644 index 000000000..45422cbc7 --- /dev/null +++ b/ast/format_test.go @@ -0,0 +1,98 @@ +package ast_test + +import ( + "bytes" + "fmt" + + . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testAstFormatSuite{}) + +type testAstFormatSuite struct { +} + +func getDefaultCharsetAndCollate() (string, string) { + return "utf8", "utf8_bin" +} + +func (ts *testAstFormatSuite) TestAstFormat(c *C) { + var testcases = []struct { + input string + output string + }{ + // Literals. + {`null`, `NULL`}, + {`true`, `TRUE`}, + {`350`, `350`}, + {`001e-12`, `1e-12`}, // Float. + {`345.678`, `345.678`}, + {`00.0001000`, `0.0001000`}, // Decimal. + {`null`, `NULL`}, + {`"Hello, world"`, `"Hello, world"`}, + {`'Hello, world'`, `"Hello, world"`}, + {`'Hello, "world"'`, `"Hello, \"world\""`}, + {`_utf8'你好'`, `"你好"`}, + {`x'bcde'`, "x'bcde'"}, + {`x''`, "x''"}, + {`x'0035'`, "x'0035'"}, // Shouldn't trim leading zero. + {`b'00111111'`, `b'111111'`}, + {`time'10:10:10.123'`, `timeliteral("10:10:10.123")`}, + {`timestamp'1999-01-01 10:0:0.123'`, `timestampliteral("1999-01-01 10:0:0.123")`}, + {`date '1700-01-01'`, `dateliteral("1700-01-01")`}, + + // Expressions. + {`f between 30 and 50`, "`f` BETWEEN 30 AND 50"}, + {`f not between 30 and 50`, "`f` NOT BETWEEN 30 AND 50"}, + {`345 + " hello "`, `345 + " hello "`}, + {`"hello world" >= 'hello world'`, `"hello world" >= "hello world"`}, + {`case 3 when 1 then false else true end`, `CASE 3 WHEN 1 THEN FALSE ELSE TRUE END`}, + {`database.table.column`, "`database`.`table`.`column`"}, // ColumnNameExpr + {`3 is null`, `3 IS NULL`}, + {`3 is not null`, `3 IS NOT NULL`}, + {`3 is true`, `3 IS TRUE`}, + {`3 is not true`, `3 IS NOT TRUE`}, + {`3 is false`, `3 IS FALSE`}, + {` ( x is false )`, "(`x` IS FALSE)"}, + {`3 in ( a,b,"h",6 )`, "3 IN (`a`,`b`,\"h\",6)"}, + {`3 not in ( a,b,"h",6 )`, "3 NOT IN (`a`,`b`,\"h\",6)"}, + {`"abc" like '%b%'`, `"abc" LIKE "%b%"`}, + {`"abc" not like '%b%'`, `"abc" NOT LIKE "%b%"`}, + {`"abc" like '%b%' escape '_'`, `"abc" LIKE "%b%" ESCAPE '_'`}, + {`"abc" regexp '.*bc?'`, `"abc" REGEXP ".*bc?"`}, + {`"abc" not regexp '.*bc?'`, `"abc" NOT REGEXP ".*bc?"`}, + {`- 4`, `-4`}, + {`- ( - 4 ) `, `-(-4)`}, + // Functions. + {` json_extract ( a,'$.b',"$.\"c d\"" ) `, "json_extract(`a`, \"$.b\", \"$.\\\"c d\\\"\")"}, + {` length ( a )`, "length(`a`)"}, + {`a -> '$.a'`, "json_extract(`a`, \"$.a\")"}, + {`a.b ->> '$.a'`, "json_unquote(json_extract(`a`.`b`, \"$.a\"))"}, + {`DATE_ADD('1970-01-01', interval 3 second)`, `date_add("1970-01-01", INTERVAL 3 SECOND)`}, + {`TIMESTAMPDIFF(month, '2001-01-01', '2001-02-02 12:03:05.123')`, `timestampdiff(MONTH, "2001-01-01", "2001-02-02 12:03:05.123")`}, + // Cast, Convert and Binary. + // There should not be spaces between 'cast' and '(' unless 'IGNORE_SPACE' mode is set. + // see: https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html + {` cast( a as signed ) `, "CAST(`a` AS SIGNED)"}, + {` cast( a as unsigned integer) `, "CAST(`a` AS UNSIGNED)"}, + {` cast( a as char(3) binary) `, "CAST(`a` AS CHAR(3) BINARY)"}, + {` cast( a as decimal ) `, "CAST(`a` AS DECIMAL(11))"}, + {` cast( a as decimal (3) ) `, "CAST(`a` AS DECIMAL(3))"}, + {` cast( a as decimal (3,3) ) `, "CAST(`a` AS DECIMAL(3, 3))"}, + {` convert (a, signed) `, "CONVERT(`a`, SIGNED)"}, + {` binary "hello"`, `BINARY "hello"`}, + } + for _, tt := range testcases { + expr := fmt.Sprintf("select %s", tt.input) + charset, collation := getDefaultCharsetAndCollate() + stmts, err := parser.New().Parse(expr, charset, collation) + node := stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr + c.Assert(err, IsNil) + + writer := bytes.NewBufferString("") + node.Format(writer) + c.Assert(writer.String(), Equals, tt.output) + } +} diff --git a/ast/functions.go b/ast/functions.go new file mode 100644 index 000000000..495c6e54f --- /dev/null +++ b/ast/functions.go @@ -0,0 +1,520 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "io" + + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" +) + +var ( + _ FuncNode = &AggregateFuncExpr{} + _ FuncNode = &FuncCallExpr{} + _ FuncNode = &FuncCastExpr{} +) + +// List scalar function names. +const ( + LogicAnd = "and" + Cast = "cast" + LeftShift = "leftshift" + RightShift = "rightshift" + LogicOr = "or" + GE = "ge" + LE = "le" + EQ = "eq" + NE = "ne" + LT = "lt" + GT = "gt" + Plus = "plus" + Minus = "minus" + And = "bitand" + Or = "bitor" + Mod = "mod" + Xor = "bitxor" + Div = "div" + Mul = "mul" + UnaryNot = "not" // Avoid name conflict with Not in github/pingcap/check. + BitNeg = "bitneg" + IntDiv = "intdiv" + LogicXor = "xor" + NullEQ = "nulleq" + UnaryPlus = "unaryplus" + UnaryMinus = "unaryminus" + In = "in" + Like = "like" + Case = "case" + Regexp = "regexp" + IsNull = "isnull" + IsTruth = "istrue" // Avoid name conflict with IsTrue in github/pingcap/check. + IsFalsity = "isfalse" // Avoid name conflict with IsFalse in github/pingcap/check. + RowFunc = "row" + SetVar = "setvar" + GetVar = "getvar" + Values = "values" + BitCount = "bit_count" + GetParam = "getparam" + + // common functions + Coalesce = "coalesce" + Greatest = "greatest" + Least = "least" + Interval = "interval" + + // math functions + Abs = "abs" + Acos = "acos" + Asin = "asin" + Atan = "atan" + Atan2 = "atan2" + Ceil = "ceil" + Ceiling = "ceiling" + Conv = "conv" + Cos = "cos" + Cot = "cot" + CRC32 = "crc32" + Degrees = "degrees" + Exp = "exp" + Floor = "floor" + Ln = "ln" + Log = "log" + Log2 = "log2" + Log10 = "log10" + PI = "pi" + Pow = "pow" + Power = "power" + Radians = "radians" + Rand = "rand" + Round = "round" + Sign = "sign" + Sin = "sin" + Sqrt = "sqrt" + Tan = "tan" + Truncate = "truncate" + + // time functions + AddDate = "adddate" + AddTime = "addtime" + ConvertTz = "convert_tz" + Curdate = "curdate" + CurrentDate = "current_date" + CurrentTime = "current_time" + CurrentTimestamp = "current_timestamp" + Curtime = "curtime" + Date = "date" + DateLiteral = "dateliteral" + DateAdd = "date_add" + DateFormat = "date_format" + DateSub = "date_sub" + DateDiff = "datediff" + Day = "day" + DayName = "dayname" + DayOfMonth = "dayofmonth" + DayOfWeek = "dayofweek" + DayOfYear = "dayofyear" + Extract = "extract" + FromDays = "from_days" + FromUnixTime = "from_unixtime" + GetFormat = "get_format" + Hour = "hour" + LocalTime = "localtime" + LocalTimestamp = "localtimestamp" + MakeDate = "makedate" + MakeTime = "maketime" + MicroSecond = "microsecond" + Minute = "minute" + Month = "month" + MonthName = "monthname" + Now = "now" + PeriodAdd = "period_add" + PeriodDiff = "period_diff" + Quarter = "quarter" + SecToTime = "sec_to_time" + Second = "second" + StrToDate = "str_to_date" + SubDate = "subdate" + SubTime = "subtime" + Sysdate = "sysdate" + Time = "time" + TimeLiteral = "timeliteral" + TimeFormat = "time_format" + TimeToSec = "time_to_sec" + TimeDiff = "timediff" + Timestamp = "timestamp" + TimestampLiteral = "timestampliteral" + TimestampAdd = "timestampadd" + TimestampDiff = "timestampdiff" + ToDays = "to_days" + ToSeconds = "to_seconds" + UnixTimestamp = "unix_timestamp" + UTCDate = "utc_date" + UTCTime = "utc_time" + UTCTimestamp = "utc_timestamp" + Week = "week" + Weekday = "weekday" + WeekOfYear = "weekofyear" + Year = "year" + YearWeek = "yearweek" + LastDay = "last_day" + + // string functions + ASCII = "ascii" + Bin = "bin" + Concat = "concat" + ConcatWS = "concat_ws" + Convert = "convert" + Elt = "elt" + ExportSet = "export_set" + Field = "field" + Format = "format" + FromBase64 = "from_base64" + InsertFunc = "insert_func" + Instr = "instr" + Lcase = "lcase" + Left = "left" + Length = "length" + LoadFile = "load_file" + Locate = "locate" + Lower = "lower" + Lpad = "lpad" + LTrim = "ltrim" + MakeSet = "make_set" + Mid = "mid" + Oct = "oct" + Ord = "ord" + Position = "position" + Quote = "quote" + Repeat = "repeat" + Replace = "replace" + Reverse = "reverse" + Right = "right" + RTrim = "rtrim" + Space = "space" + Strcmp = "strcmp" + Substring = "substring" + Substr = "substr" + SubstringIndex = "substring_index" + ToBase64 = "to_base64" + Trim = "trim" + Upper = "upper" + Ucase = "ucase" + Hex = "hex" + Unhex = "unhex" + Rpad = "rpad" + BitLength = "bit_length" + CharFunc = "char_func" + CharLength = "char_length" + CharacterLength = "character_length" + FindInSet = "find_in_set" + + // information functions + Benchmark = "benchmark" + Charset = "charset" + Coercibility = "coercibility" + Collation = "collation" + ConnectionID = "connection_id" + CurrentUser = "current_user" + Database = "database" + FoundRows = "found_rows" + LastInsertId = "last_insert_id" + RowCount = "row_count" + Schema = "schema" + SessionUser = "session_user" + SystemUser = "system_user" + User = "user" + Version = "version" + TiDBVersion = "tidb_version" + TiDBIsDDLOwner = "tidb_is_ddl_owner" + + // control functions + If = "if" + Ifnull = "ifnull" + Nullif = "nullif" + + // miscellaneous functions + AnyValue = "any_value" + DefaultFunc = "default_func" + InetAton = "inet_aton" + InetNtoa = "inet_ntoa" + Inet6Aton = "inet6_aton" + Inet6Ntoa = "inet6_ntoa" + IsFreeLock = "is_free_lock" + IsIPv4 = "is_ipv4" + IsIPv4Compat = "is_ipv4_compat" + IsIPv4Mapped = "is_ipv4_mapped" + IsIPv6 = "is_ipv6" + IsUsedLock = "is_used_lock" + MasterPosWait = "master_pos_wait" + NameConst = "name_const" + ReleaseAllLocks = "release_all_locks" + Sleep = "sleep" + UUID = "uuid" + UUIDShort = "uuid_short" + // get_lock() and release_lock() is parsed but do nothing. + // It is used for preventing error in Ruby's activerecord migrations. + GetLock = "get_lock" + ReleaseLock = "release_lock" + + // encryption and compression functions + AesDecrypt = "aes_decrypt" + AesEncrypt = "aes_encrypt" + Compress = "compress" + Decode = "decode" + DesDecrypt = "des_decrypt" + DesEncrypt = "des_encrypt" + Encode = "encode" + Encrypt = "encrypt" + MD5 = "md5" + OldPassword = "old_password" + PasswordFunc = "password_func" + RandomBytes = "random_bytes" + SHA1 = "sha1" + SHA = "sha" + SHA2 = "sha2" + Uncompress = "uncompress" + UncompressedLength = "uncompressed_length" + ValidatePasswordStrength = "validate_password_strength" + + // json functions + JSONType = "json_type" + JSONExtract = "json_extract" + JSONUnquote = "json_unquote" + JSONArray = "json_array" + JSONObject = "json_object" + JSONMerge = "json_merge" + JSONSet = "json_set" + JSONInsert = "json_insert" + JSONReplace = "json_replace" + JSONRemove = "json_remove" + JSONContains = "json_contains" + JSONContainsPath = "json_contains_path" + JSONValid = "json_valid" + JSONArrayAppend = "json_array_append" + JSONArrayInsert = "json_array_insert" + JSONMergePatch = "json_merge_patch" + JSONMergePreserve = "json_merge_preserve" + JSONPretty = "json_pretty" + JSONQuote = "json_quote" + JSONSearch = "json_search" + JSONStorageSize = "json_storage_size" + JSONDepth = "json_depth" + JSONKeys = "json_keys" + JSONLength = "json_length" +) + +// FuncCallExpr is for function expression. +type FuncCallExpr struct { + funcNode + // FnName is the function name. + FnName model.CIStr + // Args is the function args. + Args []ExprNode +} + +// Format the ExprNode into a Writer. +func (n *FuncCallExpr) Format(w io.Writer) { + fmt.Fprintf(w, "%s(", n.FnName.L) + if !n.specialFormatArgs(w) { + for i, arg := range n.Args { + arg.Format(w) + if i != len(n.Args)-1 { + fmt.Fprint(w, ", ") + } + } + } + fmt.Fprint(w, ")") +} + +// specialFormatArgs formats argument list for some special functions. +func (n *FuncCallExpr) specialFormatArgs(w io.Writer) bool { + switch n.FnName.L { + case DateAdd, DateSub, AddDate, SubDate: + n.Args[0].Format(w) + fmt.Fprint(w, ", INTERVAL ") + n.Args[1].Format(w) + fmt.Fprintf(w, " %s", n.Args[2].(ValueExpr).GetDatumString()) + return true + case TimestampAdd, TimestampDiff: + fmt.Fprintf(w, "%s, ", n.Args[0].(ValueExpr).GetDatumString()) + n.Args[1].Format(w) + fmt.Fprint(w, ", ") + n.Args[2].Format(w) + return true + } + return false +} + +// Accept implements Node interface. +func (n *FuncCallExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCallExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// CastFunctionType is the type for cast function. +type CastFunctionType int + +// CastFunction types +const ( + CastFunction CastFunctionType = iota + 1 + CastConvertFunction + CastBinaryOperator +) + +// FuncCastExpr is the cast function converting value to another type, e.g, cast(expr AS signed). +// See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html +type FuncCastExpr struct { + funcNode + // Expr is the expression to be converted. + Expr ExprNode + // Tp is the conversion type. + Tp *types.FieldType + // FunctionType is either Cast, Convert or Binary. + FunctionType CastFunctionType +} + +// Format the ExprNode into a Writer. +func (n *FuncCastExpr) Format(w io.Writer) { + switch n.FunctionType { + case CastFunction: + fmt.Fprint(w, "CAST(") + n.Expr.Format(w) + fmt.Fprint(w, " AS ") + n.Tp.FormatAsCastType(w) + fmt.Fprint(w, ")") + case CastConvertFunction: + fmt.Fprint(w, "CONVERT(") + n.Expr.Format(w) + fmt.Fprint(w, ", ") + n.Tp.FormatAsCastType(w) + fmt.Fprint(w, ")") + case CastBinaryOperator: + fmt.Fprint(w, "BINARY ") + n.Expr.Format(w) + } +} + +// Accept implements Node Accept interface. +func (n *FuncCastExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCastExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TrimDirectionType is the type for trim direction. +type TrimDirectionType int + +const ( + // TrimBothDefault trims from both direction by default. + TrimBothDefault TrimDirectionType = iota + // TrimBoth trims from both direction with explicit notation. + TrimBoth + // TrimLeading trims from left. + TrimLeading + // TrimTrailing trims from right. + TrimTrailing +) + +// DateArithType is type for DateArith type. +type DateArithType byte + +const ( + // DateArithAdd is to run adddate or date_add function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_adddate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add + DateArithAdd DateArithType = iota + 1 + // DateArithSub is to run subdate or date_sub function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subdate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-sub + DateArithSub +) + +const ( + // AggFuncCount is the name of Count function. + AggFuncCount = "count" + // AggFuncSum is the name of Sum function. + AggFuncSum = "sum" + // AggFuncAvg is the name of Avg function. + AggFuncAvg = "avg" + // AggFuncFirstRow is the name of FirstRowColumn function. + AggFuncFirstRow = "firstrow" + // AggFuncMax is the name of max function. + AggFuncMax = "max" + // AggFuncMin is the name of min function. + AggFuncMin = "min" + // AggFuncGroupConcat is the name of group_concat function. + AggFuncGroupConcat = "group_concat" + // AggFuncBitOr is the name of bit_or function. + AggFuncBitOr = "bit_or" + // AggFuncBitXor is the name of bit_xor function. + AggFuncBitXor = "bit_xor" + // AggFuncBitAnd is the name of bit_and function. + AggFuncBitAnd = "bit_and" +) + +// AggregateFuncExpr represents aggregate function expression. +type AggregateFuncExpr struct { + funcNode + // F is the function name. + F string + // Args is the function args. + Args []ExprNode + // Distinct is true, function hence only aggregate distinct values. + // For example, column c1 values are "1", "2", "2", "sum(c1)" is "5", + // but "sum(distinct c1)" is "3". + Distinct bool +} + +// Format the ExprNode into a Writer. +func (n *AggregateFuncExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *AggregateFuncExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AggregateFuncExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} diff --git a/ast/functions_test.go b/ast/functions_test.go new file mode 100644 index 000000000..d07db759b --- /dev/null +++ b/ast/functions_test.go @@ -0,0 +1,38 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + . "github.com/pingcap/parser/ast" +) + +var _ = Suite(&testFunctionsSuite{}) + +type testFunctionsSuite struct { +} + +func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { + valueExpr := NewValueExpr(42) + stmts := []Node{ + &AggregateFuncExpr{Args: []ExprNode{valueExpr}}, + &FuncCallExpr{Args: []ExprNode{valueExpr}}, + &FuncCastExpr{Expr: valueExpr}, + } + + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} diff --git a/ast/misc.go b/ast/misc.go new file mode 100644 index 000000000..fd179f6c6 --- /dev/null +++ b/ast/misc.go @@ -0,0 +1,879 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "bytes" + "fmt" + "strings" + + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" +) + +var ( + _ StmtNode = &AdminStmt{} + _ StmtNode = &AlterUserStmt{} + _ StmtNode = &BeginStmt{} + _ StmtNode = &BinlogStmt{} + _ StmtNode = &CommitStmt{} + _ StmtNode = &CreateUserStmt{} + _ StmtNode = &DeallocateStmt{} + _ StmtNode = &DoStmt{} + _ StmtNode = &ExecuteStmt{} + _ StmtNode = &ExplainStmt{} + _ StmtNode = &GrantStmt{} + _ StmtNode = &PrepareStmt{} + _ StmtNode = &RollbackStmt{} + _ StmtNode = &SetPwdStmt{} + _ StmtNode = &SetStmt{} + _ StmtNode = &UseStmt{} + _ StmtNode = &FlushStmt{} + _ StmtNode = &KillStmt{} + + _ Node = &PrivElem{} + _ Node = &VariableAssignment{} +) + +// Isolation level constants. +const ( + ReadCommitted = "READ-COMMITTED" + ReadUncommitted = "READ-UNCOMMITTED" + Serializable = "SERIALIZABLE" + RepeatableRead = "REPEATABLE-READ" + + // Valid formats for explain statement. + ExplainFormatROW = "row" + ExplainFormatDOT = "dot" +) + +var ( + // ExplainFormats stores the valid formats for explain statement, used by validator. + ExplainFormats = []string{ + ExplainFormatROW, + ExplainFormatDOT, + } +) + +// TypeOpt is used for parsing data type option from SQL. +type TypeOpt struct { + IsUnsigned bool + IsZerofill bool +} + +// FloatOpt is used for parsing floating-point type option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html +type FloatOpt struct { + Flen int + Decimal int +} + +// AuthOption is used for parsing create use statement. +type AuthOption struct { + // ByAuthString set as true, if AuthString is used for authorization. Otherwise, authorization is done by HashString. + ByAuthString bool + AuthString string + HashString string + // TODO: support auth_plugin +} + +// TraceStmt is a statement to trace what sql actually does at background. +type TraceStmt struct { + stmtNode + + Stmt StmtNode + Format string +} + +// Accept implements Node Accept interface. +func (n *TraceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TraceStmt) + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(DMLNode) + return v.Leave(n) +} + +// ExplainStmt is a statement to provide information about how is SQL statement executed +// or get columns information in a table. +// See https://dev.mysql.com/doc/refman/5.7/en/explain.html +type ExplainStmt struct { + stmtNode + + Stmt StmtNode + Format string + Analyze bool +} + +// Accept implements Node Accept interface. +func (n *ExplainStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExplainStmt) + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(DMLNode) + return v.Leave(n) +} + +// PrepareStmt is a statement to prepares a SQL statement which contains placeholders, +// and it is executed with ExecuteStmt and released with DeallocateStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/prepare.html +type PrepareStmt struct { + stmtNode + + Name string + SQLText string + SQLVar *VariableExpr +} + +// Accept implements Node Accept interface. +func (n *PrepareStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrepareStmt) + if n.SQLVar != nil { + node, ok := n.SQLVar.Accept(v) + if !ok { + return n, false + } + n.SQLVar = node.(*VariableExpr) + } + return v.Leave(n) +} + +// DeallocateStmt is a statement to release PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/deallocate-prepare.html +type DeallocateStmt struct { + stmtNode + + Name string +} + +// Accept implements Node Accept interface. +func (n *DeallocateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeallocateStmt) + return v.Leave(n) +} + +// Prepared represents a prepared statement. +type Prepared struct { + Stmt StmtNode + Params []ParamMarkerExpr + SchemaVersion int64 + UseCache bool +} + +// ExecuteStmt is a statement to execute PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/execute.html +type ExecuteStmt struct { + stmtNode + + Name string + UsingVars []ExprNode + ExecID uint32 +} + +// Accept implements Node Accept interface. +func (n *ExecuteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExecuteStmt) + for i, val := range n.UsingVars { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.UsingVars[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// BeginStmt is a statement to start a new transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type BeginStmt struct { + stmtNode +} + +// Accept implements Node Accept interface. +func (n *BeginStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BeginStmt) + return v.Leave(n) +} + +// BinlogStmt is an internal-use statement. +// We just parse and ignore it. +// See http://dev.mysql.com/doc/refman/5.7/en/binlog.html +type BinlogStmt struct { + stmtNode + Str string +} + +// Accept implements Node Accept interface. +func (n *BinlogStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BinlogStmt) + return v.Leave(n) +} + +// CommitStmt is a statement to commit the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type CommitStmt struct { + stmtNode +} + +// Accept implements Node Accept interface. +func (n *CommitStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CommitStmt) + return v.Leave(n) +} + +// RollbackStmt is a statement to roll back the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type RollbackStmt struct { + stmtNode +} + +// Accept implements Node Accept interface. +func (n *RollbackStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RollbackStmt) + return v.Leave(n) +} + +// UseStmt is a statement to use the DBName database as the current database. +// See https://dev.mysql.com/doc/refman/5.7/en/use.html +type UseStmt struct { + stmtNode + + DBName string +} + +// Accept implements Node Accept interface. +func (n *UseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UseStmt) + return v.Leave(n) +} + +const ( + // SetNames is the const for set names/charset stmt. + // If VariableAssignment.Name == Names, it should be set names/charset stmt. + SetNames = "SetNAMES" +) + +// VariableAssignment is a variable assignment struct. +type VariableAssignment struct { + node + Name string + Value ExprNode + IsGlobal bool + IsSystem bool + + // ExtendValue is a way to store extended info. + // VariableAssignment should be able to store information for SetCharset/SetPWD Stmt. + // For SetCharsetStmt, Value is charset, ExtendValue is collation. + // TODO: Use SetStmt to implement set password statement. + ExtendValue ValueExpr +} + +// Accept implements Node interface. +func (n *VariableAssignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableAssignment) + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// FlushStmtType is the type for FLUSH statement. +type FlushStmtType int + +// Flush statement types. +const ( + FlushNone FlushStmtType = iota + FlushTables + FlushPrivileges + FlushStatus +) + +// FlushStmt is a statement to flush tables/privileges/optimizer costs and so on. +type FlushStmt struct { + stmtNode + + Tp FlushStmtType // Privileges/Tables/... + NoWriteToBinLog bool + Tables []*TableName // For FlushTableStmt, if Tables is empty, it means flush all tables. + ReadLock bool +} + +// Accept implements Node Accept interface. +func (n *FlushStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FlushStmt) + return v.Leave(n) +} + +// KillStmt is a statement to kill a query or connection. +type KillStmt struct { + stmtNode + + // Query indicates whether terminate a single query on this connection or the whole connection. + // If Query is true, terminates the statement the connection is currently executing, but leaves the connection itself intact. + // If Query is false, terminates the connection associated with the given ConnectionID, after terminating any statement the connection is executing. + Query bool + ConnectionID uint64 + // TiDBExtension is used to indicate whether the user knows he is sending kill statement to the right tidb-server. + // When the SQL grammar is "KILL TIDB [CONNECTION | QUERY] connectionID", TiDBExtension will be set. + // It's a special grammar extension in TiDB. This extension exists because, when the connection is: + // client -> LVS proxy -> TiDB, and type Ctrl+C in client, the following action will be executed: + // new a connection; kill xxx; + // kill command may send to the wrong TiDB, because the exists of LVS proxy, and kill the wrong session. + // So, "KILL TIDB" grammar is introduced, and it REQUIRES DIRECT client -> TiDB TOPOLOGY. + // TODO: The standard KILL grammar will be supported once we have global connectionID. + TiDBExtension bool +} + +// Accept implements Node Accept interface. +func (n *KillStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*KillStmt) + return v.Leave(n) +} + +// SetStmt is the statement to set variables. +type SetStmt struct { + stmtNode + // Variables is the list of variable assignment. + Variables []*VariableAssignment +} + +// Accept implements Node Accept interface. +func (n *SetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetStmt) + for i, val := range n.Variables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Variables[i] = node.(*VariableAssignment) + } + return v.Leave(n) +} + +/* +// SetCharsetStmt is a statement to assign values to character and collation variables. +// See https://dev.mysql.com/doc/refman/5.7/en/set-statement.html +type SetCharsetStmt struct { + stmtNode + + Charset string + Collate string +} + +// Accept implements Node Accept interface. +func (n *SetCharsetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetCharsetStmt) + return v.Leave(n) +} +*/ + +// SetPwdStmt is a statement to assign a password to user account. +// See https://dev.mysql.com/doc/refman/5.7/en/set-password.html +type SetPwdStmt struct { + stmtNode + + User *auth.UserIdentity + Password string +} + +// SecureText implements SensitiveStatement interface. +func (n *SetPwdStmt) SecureText() string { + return fmt.Sprintf("set password for user %s", n.User) +} + +// Accept implements Node Accept interface. +func (n *SetPwdStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetPwdStmt) + return v.Leave(n) +} + +// UserSpec is used for parsing create user statement. +type UserSpec struct { + User *auth.UserIdentity + AuthOpt *AuthOption +} + +// SecurityString formats the UserSpec without password information. +func (u *UserSpec) SecurityString() string { + withPassword := false + if opt := u.AuthOpt; opt != nil { + if len(opt.AuthString) > 0 || len(opt.HashString) > 0 { + withPassword = true + } + } + if withPassword { + return fmt.Sprintf("{%s password = ***}", u.User) + } + return u.User.String() +} + +// EncodedPassword returns the encoded password (which is the real data mysql.user). +// The boolean value indicates input's password format is legal or not. +func (u *UserSpec) EncodedPassword() (string, bool) { + if u.AuthOpt == nil { + return "", true + } + + opt := u.AuthOpt + if opt.ByAuthString { + return auth.EncodePassword(opt.AuthString), true + } + + // Not a legal password string. + if len(opt.HashString) != 41 || !strings.HasPrefix(opt.HashString, "*") { + return "", false + } + return opt.HashString, true +} + +// CreateUserStmt creates user account. +// See https://dev.mysql.com/doc/refman/5.7/en/create-user.html +type CreateUserStmt struct { + stmtNode + + IfNotExists bool + Specs []*UserSpec +} + +// Accept implements Node Accept interface. +func (n *CreateUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateUserStmt) + return v.Leave(n) +} + +// SecureText implements SensitiveStatement interface. +func (n *CreateUserStmt) SecureText() string { + var buf bytes.Buffer + buf.WriteString("create user") + for _, user := range n.Specs { + buf.WriteString(" ") + buf.WriteString(user.SecurityString()) + } + return buf.String() +} + +// AlterUserStmt modifies user account. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-user.html +type AlterUserStmt struct { + stmtNode + + IfExists bool + CurrentAuth *AuthOption + Specs []*UserSpec +} + +// SecureText implements SensitiveStatement interface. +func (n *AlterUserStmt) SecureText() string { + var buf bytes.Buffer + buf.WriteString("alter user") + for _, user := range n.Specs { + buf.WriteString(" ") + buf.WriteString(user.SecurityString()) + } + return buf.String() +} + +// Accept implements Node Accept interface. +func (n *AlterUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterUserStmt) + return v.Leave(n) +} + +// DropUserStmt creates user account. +// See http://dev.mysql.com/doc/refman/5.7/en/drop-user.html +type DropUserStmt struct { + stmtNode + + IfExists bool + UserList []*auth.UserIdentity +} + +// Accept implements Node Accept interface. +func (n *DropUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropUserStmt) + return v.Leave(n) +} + +// DoStmt is the struct for DO statement. +type DoStmt struct { + stmtNode + + Exprs []ExprNode +} + +// Accept implements Node Accept interface. +func (n *DoStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DoStmt) + for i, val := range n.Exprs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Exprs[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// AdminStmtType is the type for admin statement. +type AdminStmtType int + +// Admin statement types. +const ( + AdminShowDDL = iota + 1 + AdminCheckTable + AdminShowDDLJobs + AdminCancelDDLJobs + AdminCheckIndex + AdminRecoverIndex + AdminCleanupIndex + AdminCheckIndexRange + AdminShowDDLJobQueries + AdminChecksumTable + AdminShowSlow +) + +// HandleRange represents a range where handle value >= Begin and < End. +type HandleRange struct { + Begin int64 + End int64 +} + +// ShowSlowType defines the type for SlowSlow statement. +type ShowSlowType int + +const ( + // ShowSlowTop is a ShowSlowType constant. + ShowSlowTop ShowSlowType = iota + // ShowSlowRecent is a ShowSlowType constant. + ShowSlowRecent +) + +// ShowSlowKind defines the kind for SlowSlow statement when the type is ShowSlowTop. +type ShowSlowKind int + +const ( + // ShowSlowKindDefault is a ShowSlowKind constant. + ShowSlowKindDefault ShowSlowKind = iota + // ShowSlowKindInternal is a ShowSlowKind constant. + ShowSlowKindInternal + // ShowSlowKindAll is a ShowSlowKind constant. + ShowSlowKindAll +) + +// ShowSlow is used for the following command: +// admin show slow top [ internal | all] N +// admin show slow recent N +type ShowSlow struct { + Tp ShowSlowType + Count uint64 + Kind ShowSlowKind +} + +// AdminStmt is the struct for Admin statement. +type AdminStmt struct { + stmtNode + + Tp AdminStmtType + Index string + Tables []*TableName + JobIDs []int64 + JobNumber int64 + + HandleRanges []HandleRange + ShowSlow *ShowSlow +} + +// Accept implements Node Accept interface. +func (n *AdminStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*AdminStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + + return v.Leave(n) +} + +// PrivElem is the privilege type and optional column list. +type PrivElem struct { + node + + Priv mysql.PrivilegeType + Cols []*ColumnName +} + +// Accept implements Node Accept interface. +func (n *PrivElem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrivElem) + for i, val := range n.Cols { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// ObjectTypeType is the type for object type. +type ObjectTypeType int + +const ( + // ObjectTypeNone is for empty object type. + ObjectTypeNone ObjectTypeType = iota + 1 + // ObjectTypeTable means the following object is a table. + ObjectTypeTable +) + +// GrantLevelType is the type for grant level. +type GrantLevelType int + +const ( + // GrantLevelNone is the dummy const for default value. + GrantLevelNone GrantLevelType = iota + 1 + // GrantLevelGlobal means the privileges are administrative or apply to all databases on a given server. + GrantLevelGlobal + // GrantLevelDB means the privileges apply to all objects in a given database. + GrantLevelDB + // GrantLevelTable means the privileges apply to all columns in a given table. + GrantLevelTable +) + +// GrantLevel is used for store the privilege scope. +type GrantLevel struct { + Level GrantLevelType + DBName string + TableName string +} + +// RevokeStmt is the struct for REVOKE statement. +type RevokeStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec +} + +// Accept implements Node Accept interface. +func (n *RevokeStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RevokeStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// GrantStmt is the struct for GRANT statement. +type GrantStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec + WithGrant bool +} + +// SecureText implements SensitiveStatement interface. +func (n *GrantStmt) SecureText() string { + text := n.text + // Filter "identified by xxx" because it would expose password information. + idx := strings.Index(strings.ToLower(text), "identified") + if idx > 0 { + text = text[:idx] + } + return text +} + +// Accept implements Node Accept interface. +func (n *GrantStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// Ident is the table identifier composed of schema name and table name. +type Ident struct { + Schema model.CIStr + Name model.CIStr +} + +// String implements fmt.Stringer interface. +func (i Ident) String() string { + if i.Schema.O == "" { + return i.Name.O + } + return fmt.Sprintf("%s.%s", i.Schema, i.Name) +} + +// SelectStmtOpts wrap around select hints and switches +type SelectStmtOpts struct { + Distinct bool + SQLCache bool + CalcFoundRows bool + StraightJoin bool + Priority mysql.PriorityEnum + TableHints []*TableOptimizerHint +} + +// TableOptimizerHint is Table level optimizer hint +type TableOptimizerHint struct { + node + // HintName is the name or alias of the table(s) which the hint will affect. + // Table hints has no schema info + // It allows only table name or alias (if table has an alias) + HintName model.CIStr + Tables []model.CIStr + // Statement Execution Time Optimizer Hints + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer-hints-execution-time + MaxExecutionTime uint64 +} + +// Accept implements Node Accept interface. +func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableOptimizerHint) + return v.Leave(n) +} + +// NewDecimal creates a types.Decimal value, it's provided by parser driver. +var NewDecimal func(string) (interface{}, error) + +// NewHexLiteral creates a types.HexLiteral value, it's provided by parser driver. +var NewHexLiteral func(string) (interface{}, error) + +// NewBitLiteral creates a types.BitLiteral value, it's provided by parser driver. +var NewBitLiteral func(string) (interface{}, error) diff --git a/ast/misc_test.go b/ast/misc_test.go new file mode 100644 index 000000000..7e1b80ec0 --- /dev/null +++ b/ast/misc_test.go @@ -0,0 +1,190 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/parser" + . "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" +) + +var _ = Suite(&testMiscSuite{}) + +type testMiscSuite struct { +} + +type visitor struct{} + +func (v visitor) Enter(in Node) (Node, bool) { + return in, false +} + +func (v visitor) Leave(in Node) (Node, bool) { + return in, true +} + +type visitor1 struct { + visitor +} + +func (visitor1) Enter(in Node) (Node, bool) { + return in, true +} + +func (ts *testMiscSuite) TestMiscVisitorCover(c *C) { + valueExpr := NewValueExpr(42) + stmts := []Node{ + &AdminStmt{}, + &AlterUserStmt{}, + &BeginStmt{}, + &BinlogStmt{}, + &CommitStmt{}, + &CreateUserStmt{}, + &DeallocateStmt{}, + &DoStmt{}, + &ExecuteStmt{UsingVars: []ExprNode{valueExpr}}, + &ExplainStmt{Stmt: &ShowStmt{}}, + &GrantStmt{}, + &PrepareStmt{SQLVar: &VariableExpr{Value: valueExpr}}, + &RollbackStmt{}, + &SetPwdStmt{}, + &SetStmt{Variables: []*VariableAssignment{ + { + Value: valueExpr, + }, + }}, + &UseStmt{}, + &AnalyzeTableStmt{ + TableNames: []*TableName{ + {}, + }, + }, + &FlushStmt{}, + &PrivElem{}, + &VariableAssignment{Value: valueExpr}, + &KillStmt{}, + &DropStatsStmt{Table: &TableName{}}, + } + + for _, v := range stmts { + v.Accept(visitor{}) + v.Accept(visitor1{}) + } +} + +func (ts *testMiscSuite) TestDDLVisitorCover(c *C) { + sql := ` +create table t (c1 smallint unsigned, c2 int unsigned); +alter table t add column a smallint unsigned after b; +create index t_i on t (id); +create database test character set utf8; +drop database test; +drop index t_i on t; +drop table t; +truncate t; +create table t ( +jobAbbr char(4) not null, +constraint foreign key (jobabbr) references ffxi_jobtype (jobabbr) on delete cascade on update cascade +); +` + parse := parser.New() + stmts, err := parse.Parse(sql, "", "") + c.Assert(err, IsNil) + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func (ts *testMiscSuite) TestDMLVistorCover(c *C) { + sql := `delete from somelog where user = 'jcole' order by timestamp_column limit 1; +delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; +select * from t where exists(select * from t k where t.c = k.c having sum(c) = 1); +insert into t_copy select * from t where t.x > 5; +(select /*+ TIDB_INLJ(t1) */ a from t1 where a=10 and b=1) union (select /*+ TIDB_SMJ(t2) */ a from t2 where a=11 and b=2) order by a limit 10; +update t1 set col1 = col1 + 1, col2 = col1; +show create table t; +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b';` + + p := parser.New() + stmts, err := p.Parse(sql, "", "") + c.Assert(err, IsNil) + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func (ts *testMiscSuite) TestSensitiveStatement(c *C) { + positive := []StmtNode{ + &SetPwdStmt{}, + &CreateUserStmt{}, + &AlterUserStmt{}, + &GrantStmt{}, + } + for i, stmt := range positive { + _, ok := stmt.(SensitiveStmtNode) + c.Assert(ok, IsTrue, Commentf("%d, %#v fail", i, stmt)) + } + + negative := []StmtNode{ + &DropUserStmt{}, + &RevokeStmt{}, + &AlterTableStmt{}, + &CreateDatabaseStmt{}, + &CreateIndexStmt{}, + &CreateTableStmt{}, + &DropDatabaseStmt{}, + &DropIndexStmt{}, + &DropTableStmt{}, + &RenameTableStmt{}, + &TruncateTableStmt{}, + } + for _, stmt := range negative { + _, ok := stmt.(SensitiveStmtNode) + c.Assert(ok, IsFalse) + } +} + +func (ts *testMiscSuite) TestUserSpec(c *C) { + hashString := "*3D56A309CD04FA2EEF181462E59011F075C89548" + u := UserSpec{ + User: &auth.UserIdentity{ + Username: "test", + }, + AuthOpt: &AuthOption{ + ByAuthString: false, + AuthString: "xxx", + HashString: hashString, + }, + } + pwd, ok := u.EncodedPassword() + c.Assert(ok, IsTrue) + c.Assert(pwd, Equals, u.AuthOpt.HashString) + + u.AuthOpt.HashString = "not-good-password-format" + pwd, ok = u.EncodedPassword() + c.Assert(ok, IsFalse) + + u.AuthOpt.ByAuthString = true + pwd, ok = u.EncodedPassword() + c.Assert(ok, IsTrue) + c.Assert(pwd, Equals, hashString) + + u.AuthOpt.AuthString = "" + pwd, ok = u.EncodedPassword() + c.Assert(ok, IsTrue) + c.Assert(pwd, Equals, "") +} diff --git a/ast/read_only_checker.go b/ast/read_only_checker.go new file mode 100644 index 000000000..99c48f580 --- /dev/null +++ b/ast/read_only_checker.go @@ -0,0 +1,61 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +// IsReadOnly checks whether the input ast is readOnly. +func IsReadOnly(node Node) bool { + switch st := node.(type) { + case *SelectStmt: + if st.LockTp == SelectLockForUpdate { + return false + } + + checker := readOnlyChecker{ + readOnly: true, + } + + node.Accept(&checker) + return checker.readOnly + case *ExplainStmt, *DoStmt: + return true + default: + return false + } +} + +// readOnlyChecker checks whether a query's ast is readonly, if it satisfied +// 1. selectstmt; +// 2. need not to set var; +// it is readonly statement. +type readOnlyChecker struct { + readOnly bool +} + +// Enter implements Visitor interface. +func (checker *readOnlyChecker) Enter(in Node) (out Node, skipChildren bool) { + switch node := in.(type) { + case *VariableExpr: + // like func rewriteVariable(), this stands for SetVar. + if !node.IsSystem && node.Value != nil { + checker.readOnly = false + return in, true + } + } + return in, false +} + +// Leave implements Visitor interface. +func (checker *readOnlyChecker) Leave(in Node) (out Node, ok bool) { + return in, checker.readOnly +} diff --git a/ast/read_only_checker_test.go b/ast/read_only_checker_test.go new file mode 100644 index 000000000..7abd27f06 --- /dev/null +++ b/ast/read_only_checker_test.go @@ -0,0 +1,44 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testCacheableSuite{}) + +type testCacheableSuite struct { +} + +func (s *testCacheableSuite) TestCacheable(c *C) { + // test non-SelectStmt + var stmt Node = &DeleteStmt{} + c.Assert(IsReadOnly(stmt), IsFalse) + + stmt = &InsertStmt{} + c.Assert(IsReadOnly(stmt), IsFalse) + + stmt = &UpdateStmt{} + c.Assert(IsReadOnly(stmt), IsFalse) + + stmt = &ExplainStmt{} + c.Assert(IsReadOnly(stmt), IsTrue) + + stmt = &ExplainStmt{} + c.Assert(IsReadOnly(stmt), IsTrue) + + stmt = &DoStmt{} + c.Assert(IsReadOnly(stmt), IsTrue) +} diff --git a/ast/stats.go b/ast/stats.go new file mode 100644 index 000000000..5db8664a5 --- /dev/null +++ b/ast/stats.go @@ -0,0 +1,91 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import "github.com/pingcap/parser/model" + +var ( + _ StmtNode = &AnalyzeTableStmt{} + _ StmtNode = &DropStatsStmt{} + _ StmtNode = &LoadStatsStmt{} +) + +// AnalyzeTableStmt is used to create table statistics. +type AnalyzeTableStmt struct { + stmtNode + + TableNames []*TableName + PartitionNames []model.CIStr + IndexNames []model.CIStr + MaxNumBuckets uint64 + + // IndexFlag is true when we only analyze indices for a table. + IndexFlag bool +} + +// Accept implements Node Accept interface. +func (n *AnalyzeTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AnalyzeTableStmt) + for i, val := range n.TableNames { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.TableNames[i] = node.(*TableName) + } + return v.Leave(n) +} + +// DropStatsStmt is used to drop table statistics. +type DropStatsStmt struct { + stmtNode + + Table *TableName +} + +// Accept implements Node Accept interface. +func (n *DropStatsStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropStatsStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +// LoadStatsStmt is the statement node for loading statistic. +type LoadStatsStmt struct { + stmtNode + + Path string +} + +// Accept implements Node Accept interface. +func (n *LoadStatsStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadStatsStmt) + return v.Leave(n) +} diff --git a/auth/auth.go b/auth/auth.go new file mode 100644 index 000000000..1d33fbdc0 --- /dev/null +++ b/auth/auth.go @@ -0,0 +1,103 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package auth + +import ( + "bytes" + "crypto/sha1" + "encoding/hex" + "fmt" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" +) + +// UserIdentity represents username and hostname. +type UserIdentity struct { + Username string + Hostname string + CurrentUser bool + AuthUsername string // Username matched in privileges system + AuthHostname string // Match in privs system (i.e. could be a wildcard) +} + +// String converts UserIdentity to the format user@host. +func (user *UserIdentity) String() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("%s@%s", user.Username, user.Hostname) +} + +// AuthIdentityString returns matched identity in user@host format +func (user *UserIdentity) AuthIdentityString() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("%s@%s", user.AuthUsername, user.AuthHostname) +} + +// CheckScrambledPassword check scrambled password received from client. +// The new authentication is performed in following manner: +// SERVER: public_seed=create_random_string() +// send(public_seed) +// CLIENT: recv(public_seed) +// hash_stage1=sha1("password") +// hash_stage2=sha1(hash_stage1) +// reply=xor(hash_stage1, sha1(public_seed,hash_stage2) +// // this three steps are done in scramble() +// send(reply) +// SERVER: recv(reply) +// hash_stage1=xor(reply, sha1(public_seed,hash_stage2)) +// candidate_hash2=sha1(hash_stage1) +// check(candidate_hash2==hash_stage2) +// // this three steps are done in check_scramble() +func CheckScrambledPassword(salt, hpwd, auth []byte) bool { + crypt := sha1.New() + _, err := crypt.Write(salt) + terror.Log(errors.Trace(err)) + _, err = crypt.Write(hpwd) + terror.Log(errors.Trace(err)) + hash := crypt.Sum(nil) + // token = scrambleHash XOR stage1Hash + for i := range hash { + hash[i] ^= auth[i] + } + + return bytes.Equal(hpwd, Sha1Hash(hash)) +} + +// Sha1Hash is an util function to calculate sha1 hash. +func Sha1Hash(bs []byte) []byte { + crypt := sha1.New() + _, err := crypt.Write(bs) + terror.Log(errors.Trace(err)) + return crypt.Sum(nil) +} + +// EncodePassword converts plaintext password to hashed hex string. +func EncodePassword(pwd string) string { + if len(pwd) == 0 { + return "" + } + hash1 := Sha1Hash([]byte(pwd)) + hash2 := Sha1Hash(hash1) + + return fmt.Sprintf("*%X", hash2) +} + +// DecodePassword converts hex string password without prefix '*' to byte array. +func DecodePassword(pwd string) ([]byte, error) { + x, err := hex.DecodeString(pwd[1:]) + if err != nil { + return nil, errors.Trace(err) + } + return x, nil +} diff --git a/auth/auth_test.go b/auth/auth_test.go new file mode 100644 index 000000000..86cdd11ed --- /dev/null +++ b/auth/auth_test.go @@ -0,0 +1,50 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package auth + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testleak" +) + +var _ = Suite(&testAuthSuite{}) + +type testAuthSuite struct { +} + +func (s *testAuthSuite) TestEncodePassword(c *C) { + defer testleak.AfterTest(c)() + pwd := "123" + c.Assert(EncodePassword(pwd), Equals, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257") +} + +func (s *testAuthSuite) TestDecodePassword(c *C) { + defer testleak.AfterTest(c)() + x, err := DecodePassword(EncodePassword("123")) + c.Assert(err, IsNil) + c.Assert(x, DeepEquals, Sha1Hash(Sha1Hash([]byte("123")))) +} + +func (s *testAuthSuite) TestCheckScramble(c *C) { + defer testleak.AfterTest(c)() + pwd := "abc" + salt := []byte{85, 92, 45, 22, 58, 79, 107, 6, 122, 125, 58, 80, 12, 90, 103, 32, 90, 10, 74, 82} + auth := []byte{24, 180, 183, 225, 166, 6, 81, 102, 70, 248, 199, 143, 91, 204, 169, 9, 161, 171, 203, 33} + encodepwd := EncodePassword(pwd) + hpwd, err := DecodePassword(encodepwd) + c.Assert(err, IsNil) + + res := CheckScrambledPassword(salt, hpwd, auth) + c.Assert(res, IsTrue) +} diff --git a/bench_test.go b/bench_test.go new file mode 100644 index 000000000..b22f81146 --- /dev/null +++ b/bench_test.go @@ -0,0 +1,66 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "testing" +) + +func BenchmarkSysbenchSelect(b *testing.B) { + parser := New() + sql := "SELECT pad FROM sbtest1 WHERE id=1;" + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := parser.Parse(sql, "", "") + if err != nil { + b.Fatal(err) + } + } + b.ReportAllocs() +} + +func BenchmarkParseComplex(b *testing.B) { + var table = []string{ + `SELECT DISTINCT ca.l9_convergence_code AS atb2, cu.cust_sub_type AS account_type, cst.description AS account_type_desc, ss.prim_resource_val AS msisdn, ca.ban AS ban_key, To_char(mo.memo_date, 'YYYYMMDD') AS memo_date, cu.l9_identification AS thai_id, ss.subscriber_no AS subs_key, ss.dealer_code AS shop_code, cd.description AS shop_name, mot.short_desc, Regexp_substr(mo.attr1value, '[^ ;]+', 1, 3) staff_id, mo.operator_id AS user_id, mo.memo_system_text, co2.soc_name AS first_socname, co3.soc_name AS previous_socname, co.soc_name AS current_socname, Regexp_substr(mo.attr1value, '[^ ; ]+', 1, 1) NAME, co.soc_description AS current_pp_desc, co3.soc_description AS prev_pp_desc, co.soc_cd AS soc_cd, ( SELECT Sum(br.amount) FROM bl1_rc_rates BR, customer CU, subscriber SS WHERE br.service_receiver_id = ss.subscriber_no AND br.receiver_customer = ss.customer_id AND br.effective_date <= br.expiration_date AND (( ss. sub_status <> 'C' AND ss. sub_status <> 'T' AND br.expiration_date IS NULL) OR ( ss. sub_status = 'C' AND br.expiration_date LIKE ss.effective_date)) AND br.pp_ind = 'Y' AND br.cycle_code = cu.bill_cycle) AS pp_rate, cu.bill_cycle AS cycle_code, To_char(Nvl(ss.l9_tmv_act_date, ss.init_act_date),'YYYYMMDD') AS activated_date, To_char(cd.effective_date, 'YYYYMMDD') AS shop_effective_date, cd.expiration_date AS shop_expired_date, ca.l9_company_code AS company_code FROM service_details S, product CO, csm_pay_channel CPC, account CA, subscriber SS, customer CU, customer_sub_type CST, csm_dealer CD, service_details S2, product CO2, service_details S3, product CO3, memo MO , memo_type MOT, logical_date LO, charge_details CHD WHERE ss.subscriber_no = chd.agreement_no AND cpc.pym_channel_no = chd.target_pcn AND chd.chg_split_type = 'DR' AND chd.expiration_date IS NULL AND s.soc = co.soc_cd AND co.soc_type = 'P' AND s.agreement_no = ss.subscriber_no AND ss.prim_resource_tp = 'C' AND cpc.payment_category = 'POST' AND ca.ban = cpc.ban AND ( ca.l9_company_code = 'RF' OR ca.l9_company_code = 'RM' OR ca.l9_company_code = 'TM') AND ss.customer_id = cu.customer_id AND cu.cust_sub_type = cst.cust_sub_type AND cu.customer_type = cst.customer_type AND ss.dealer_code = cd.dealer AND s2.effective_date= ( SELECT Max(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co.soc_cd = sa1.soc AND co.soc_type = 'P' ) AND s2.agreement_no = s.agreement_no AND s2.soc = co2.soc_cd AND co2.soc_type = 'P' AND s2.effective_date = ( SELECT Min(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co2.soc_cd = sa1.soc AND co.soc_type = 'P' ) AND s3.agreement_no = s.agreement_no AND s3.soc = co3.soc_cd AND co3.soc_type = 'P' AND s3.effective_date = ( SELECT Max(sa1.effective_date) FROM service_details SA1, a product o1 WHERE sa1.agreement_no = ss.subscriber_no AND sa1.effective_date < ( SELECT Max(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co3.soc_cd = sa1.soc AND co3.soc_type = 'P' ) AND co3.soc_cd = sa1.soc AND o1.soc_type = 'P' ) AND mo.entity_id = ss.subscriber_no AND mo.entity_type_id = 6 AND mo.memo_type_id = mot.memo_type_id AND Trunc(mo.sys_creation_date) = ( SELECT Trunc(lo.logical_date - 1) FROM lo) trunc(lo.logical_date - 1) AND lo.expiration_date IS NULL AND lo.logical_date_type = 'B' AND lo.expiration_date IS NULL AND ( mot.short_desc = 'BCN' OR mot.short_desc = 'BCNM' )`} + parser := New() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, v := range table { + _, err := parser.Parse(v, "", "") + if err != nil { + b.Failed() + } + } + } + b.ReportAllocs() +} + +func BenchmarkParseSimple(b *testing.B) { + var table = []string{ + "insert into t values (1), (2), (3)", + "insert into t values (4), (5), (6), (7)", + "select c from t where c > 2", + } + parser := New() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, v := range table { + _, err := parser.Parse(v, "", "") + if err != nil { + b.Failed() + } + } + } + b.ReportAllocs() +} diff --git a/charset/charset.go b/charset/charset.go new file mode 100644 index 000000000..0511f5540 --- /dev/null +++ b/charset/charset.go @@ -0,0 +1,417 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" +) + +// Charset is a charset. +// Now we only support MySQL. +type Charset struct { + Name string + DefaultCollation string + Collations map[string]*Collation + Desc string + Maxlen int +} + +// Collation is a collation. +// Now we only support MySQL. +type Collation struct { + ID int + CharsetName string + Name string + IsDefault bool +} + +var charsets = make(map[string]*Charset) + +// All the supported charsets should be in the following table. +var charsetInfos = []*Charset{ + {CharsetUTF8, CollationUTF8, make(map[string]*Collation), "UTF-8 Unicode", 3}, + {CharsetUTF8MB4, CollationUTF8MB4, make(map[string]*Collation), "UTF-8 Unicode", 4}, + {CharsetASCII, CollationASCII, make(map[string]*Collation), "US ASCII", 1}, + {CharsetLatin1, CollationLatin1, make(map[string]*Collation), "Latin1", 1}, + {CharsetBin, CollationBin, make(map[string]*Collation), "binary", 1}, +} + +// Desc is a charset description. +type Desc struct { + Name string + Desc string + DefaultCollation string + Maxlen int +} + +// GetAllCharsets gets all charset descriptions in the local charsets. +func GetAllCharsets() []*Desc { + descs := make([]*Desc, 0, len(charsets)) + // The charsetInfos is an array, so the iterate order will be stable. + for _, ci := range charsetInfos { + c, ok := charsets[ci.Name] + if !ok { + continue + } + desc := &Desc{ + Name: c.Name, + DefaultCollation: c.DefaultCollation, + Desc: c.Desc, + Maxlen: c.Maxlen, + } + descs = append(descs, desc) + } + return descs +} + +// ValidCharsetAndCollation checks the charset and the collation validity +// and returns a boolean. +func ValidCharsetAndCollation(cs string, co string) bool { + // We will use utf8 as a default charset. + if cs == "" { + cs = "utf8" + } + cs = strings.ToLower(cs) + c, ok := charsets[cs] + if !ok { + return false + } + + if co == "" { + return true + } + _, ok = c.Collations[co] + if !ok { + return false + } + + return true +} + +// GetDefaultCollation returns the default collation for charset. +func GetDefaultCollation(charset string) (string, error) { + charset = strings.ToLower(charset) + if charset == CharsetBin { + return CollationBin, nil + } + c, ok := charsets[charset] + if !ok { + return "", errors.Errorf("Unknown charset %s", charset) + } + return c.DefaultCollation, nil +} + +// GetCharsetInfo returns charset and collation for cs as name. +func GetCharsetInfo(cs string) (string, string, error) { + c, ok := charsets[strings.ToLower(cs)] + if !ok { + return "", "", errors.Errorf("Unknown charset %s", cs) + } + return c.Name, c.DefaultCollation, nil +} + +// GetCharsetDesc gets charset descriptions in the local charsets. +func GetCharsetDesc(cs string) (*Desc, error) { + c, ok := charsets[strings.ToLower(cs)] + if !ok { + return nil, errors.Errorf("Unknown charset %s", cs) + } + desc := &Desc{ + Name: c.Name, + DefaultCollation: c.DefaultCollation, + Desc: c.Desc, + Maxlen: c.Maxlen, + } + return desc, nil +} + +// GetCharsetInfoByID returns charset and collation for id as cs_number. +func GetCharsetInfoByID(coID int) (string, string, error) { + if coID == mysql.DefaultCollationID { + return mysql.DefaultCharset, mysql.DefaultCollationName, nil + } + for _, collation := range collations { + if coID == collation.ID { + return collation.CharsetName, collation.Name, nil + } + } + return "", "", errors.Errorf("Unknown charset id %d", coID) +} + +// GetCollations returns a list for all collations. +func GetCollations() []*Collation { + return collations +} + +const ( + // CharsetBin is used for marking binary charset. + CharsetBin = "binary" + // CollationBin is the default collation for CharsetBin. + CollationBin = "binary" + // CharsetUTF8 is the default charset for string types. + CharsetUTF8 = "utf8" + // CollationUTF8 is the default collation for CharsetUTF8. + CollationUTF8 = "utf8_bin" + // CharsetUTF8MB4 represents 4 bytes utf8, which works the same way as utf8 in Go. + CharsetUTF8MB4 = "utf8mb4" + // CollationUTF8MB4 is the default collation for CharsetUTF8MB4. + CollationUTF8MB4 = "utf8mb4_bin" + // CharsetASCII is a subset of UTF8. + CharsetASCII = "ascii" + // CollationASCII is the default collation for CharsetACSII. + CollationASCII = "ascii_bin" + // CharsetLatin1 is a single byte charset. + CharsetLatin1 = "latin1" + // CollationLatin1 is the default collation for CharsetLatin1. + CollationLatin1 = "latin1_bin" +) + +var collations = []*Collation{ + {1, "big5", "big5_chinese_ci", true}, + {2, "latin2", "latin2_czech_cs", false}, + {3, "dec8", "dec8_swedish_ci", true}, + {4, "cp850", "cp850_general_ci", true}, + {5, "latin1", "latin1_german1_ci", false}, + {6, "hp8", "hp8_english_ci", true}, + {7, "koi8r", "koi8r_general_ci", true}, + {8, "latin1", "latin1_swedish_ci", true}, + {9, "latin2", "latin2_general_ci", true}, + {10, "swe7", "swe7_swedish_ci", true}, + {11, "ascii", "ascii_general_ci", true}, + {12, "ujis", "ujis_japanese_ci", true}, + {13, "sjis", "sjis_japanese_ci", true}, + {14, "cp1251", "cp1251_bulgarian_ci", false}, + {15, "latin1", "latin1_danish_ci", false}, + {16, "hebrew", "hebrew_general_ci", true}, + {18, "tis620", "tis620_thai_ci", true}, + {19, "euckr", "euckr_korean_ci", true}, + {20, "latin7", "latin7_estonian_cs", false}, + {21, "latin2", "latin2_hungarian_ci", false}, + {22, "koi8u", "koi8u_general_ci", true}, + {23, "cp1251", "cp1251_ukrainian_ci", false}, + {24, "gb2312", "gb2312_chinese_ci", true}, + {25, "greek", "greek_general_ci", true}, + {26, "cp1250", "cp1250_general_ci", true}, + {27, "latin2", "latin2_croatian_ci", false}, + {28, "gbk", "gbk_chinese_ci", true}, + {29, "cp1257", "cp1257_lithuanian_ci", false}, + {30, "latin5", "latin5_turkish_ci", true}, + {31, "latin1", "latin1_german2_ci", false}, + {32, "armscii8", "armscii8_general_ci", true}, + {33, "utf8", "utf8_general_ci", true}, + {34, "cp1250", "cp1250_czech_cs", false}, + {35, "ucs2", "ucs2_general_ci", true}, + {36, "cp866", "cp866_general_ci", true}, + {37, "keybcs2", "keybcs2_general_ci", true}, + {38, "macce", "macce_general_ci", true}, + {39, "macroman", "macroman_general_ci", true}, + {40, "cp852", "cp852_general_ci", true}, + {41, "latin7", "latin7_general_ci", true}, + {42, "latin7", "latin7_general_cs", false}, + {43, "macce", "macce_bin", false}, + {44, "cp1250", "cp1250_croatian_ci", false}, + {45, "utf8mb4", "utf8mb4_general_ci", true}, + {46, "utf8mb4", "utf8mb4_bin", false}, + {47, "latin1", "latin1_bin", false}, + {48, "latin1", "latin1_general_ci", false}, + {49, "latin1", "latin1_general_cs", false}, + {50, "cp1251", "cp1251_bin", false}, + {51, "cp1251", "cp1251_general_ci", true}, + {52, "cp1251", "cp1251_general_cs", false}, + {53, "macroman", "macroman_bin", false}, + {54, "utf16", "utf16_general_ci", true}, + {55, "utf16", "utf16_bin", false}, + {56, "utf16le", "utf16le_general_ci", true}, + {57, "cp1256", "cp1256_general_ci", true}, + {58, "cp1257", "cp1257_bin", false}, + {59, "cp1257", "cp1257_general_ci", true}, + {60, "utf32", "utf32_general_ci", true}, + {61, "utf32", "utf32_bin", false}, + {62, "utf16le", "utf16le_bin", false}, + {63, "binary", "binary", true}, + {64, "armscii8", "armscii8_bin", false}, + {65, "ascii", "ascii_bin", false}, + {66, "cp1250", "cp1250_bin", false}, + {67, "cp1256", "cp1256_bin", false}, + {68, "cp866", "cp866_bin", false}, + {69, "dec8", "dec8_bin", false}, + {70, "greek", "greek_bin", false}, + {71, "hebrew", "hebrew_bin", false}, + {72, "hp8", "hp8_bin", false}, + {73, "keybcs2", "keybcs2_bin", false}, + {74, "koi8r", "koi8r_bin", false}, + {75, "koi8u", "koi8u_bin", false}, + {77, "latin2", "latin2_bin", false}, + {78, "latin5", "latin5_bin", false}, + {79, "latin7", "latin7_bin", false}, + {80, "cp850", "cp850_bin", false}, + {81, "cp852", "cp852_bin", false}, + {82, "swe7", "swe7_bin", false}, + {83, "utf8", "utf8_bin", false}, + {84, "big5", "big5_bin", false}, + {85, "euckr", "euckr_bin", false}, + {86, "gb2312", "gb2312_bin", false}, + {87, "gbk", "gbk_bin", false}, + {88, "sjis", "sjis_bin", false}, + {89, "tis620", "tis620_bin", false}, + {90, "ucs2", "ucs2_bin", false}, + {91, "ujis", "ujis_bin", false}, + {92, "geostd8", "geostd8_general_ci", true}, + {93, "geostd8", "geostd8_bin", false}, + {94, "latin1", "latin1_spanish_ci", false}, + {95, "cp932", "cp932_japanese_ci", true}, + {96, "cp932", "cp932_bin", false}, + {97, "eucjpms", "eucjpms_japanese_ci", true}, + {98, "eucjpms", "eucjpms_bin", false}, + {99, "cp1250", "cp1250_polish_ci", false}, + {101, "utf16", "utf16_unicode_ci", false}, + {102, "utf16", "utf16_icelandic_ci", false}, + {103, "utf16", "utf16_latvian_ci", false}, + {104, "utf16", "utf16_romanian_ci", false}, + {105, "utf16", "utf16_slovenian_ci", false}, + {106, "utf16", "utf16_polish_ci", false}, + {107, "utf16", "utf16_estonian_ci", false}, + {108, "utf16", "utf16_spanish_ci", false}, + {109, "utf16", "utf16_swedish_ci", false}, + {110, "utf16", "utf16_turkish_ci", false}, + {111, "utf16", "utf16_czech_ci", false}, + {112, "utf16", "utf16_danish_ci", false}, + {113, "utf16", "utf16_lithuanian_ci", false}, + {114, "utf16", "utf16_slovak_ci", false}, + {115, "utf16", "utf16_spanish2_ci", false}, + {116, "utf16", "utf16_roman_ci", false}, + {117, "utf16", "utf16_persian_ci", false}, + {118, "utf16", "utf16_esperanto_ci", false}, + {119, "utf16", "utf16_hungarian_ci", false}, + {120, "utf16", "utf16_sinhala_ci", false}, + {121, "utf16", "utf16_german2_ci", false}, + {122, "utf16", "utf16_croatian_ci", false}, + {123, "utf16", "utf16_unicode_520_ci", false}, + {124, "utf16", "utf16_vietnamese_ci", false}, + {128, "ucs2", "ucs2_unicode_ci", false}, + {129, "ucs2", "ucs2_icelandic_ci", false}, + {130, "ucs2", "ucs2_latvian_ci", false}, + {131, "ucs2", "ucs2_romanian_ci", false}, + {132, "ucs2", "ucs2_slovenian_ci", false}, + {133, "ucs2", "ucs2_polish_ci", false}, + {134, "ucs2", "ucs2_estonian_ci", false}, + {135, "ucs2", "ucs2_spanish_ci", false}, + {136, "ucs2", "ucs2_swedish_ci", false}, + {137, "ucs2", "ucs2_turkish_ci", false}, + {138, "ucs2", "ucs2_czech_ci", false}, + {139, "ucs2", "ucs2_danish_ci", false}, + {140, "ucs2", "ucs2_lithuanian_ci", false}, + {141, "ucs2", "ucs2_slovak_ci", false}, + {142, "ucs2", "ucs2_spanish2_ci", false}, + {143, "ucs2", "ucs2_roman_ci", false}, + {144, "ucs2", "ucs2_persian_ci", false}, + {145, "ucs2", "ucs2_esperanto_ci", false}, + {146, "ucs2", "ucs2_hungarian_ci", false}, + {147, "ucs2", "ucs2_sinhala_ci", false}, + {148, "ucs2", "ucs2_german2_ci", false}, + {149, "ucs2", "ucs2_croatian_ci", false}, + {150, "ucs2", "ucs2_unicode_520_ci", false}, + {151, "ucs2", "ucs2_vietnamese_ci", false}, + {159, "ucs2", "ucs2_general_mysql500_ci", false}, + {160, "utf32", "utf32_unicode_ci", false}, + {161, "utf32", "utf32_icelandic_ci", false}, + {162, "utf32", "utf32_latvian_ci", false}, + {163, "utf32", "utf32_romanian_ci", false}, + {164, "utf32", "utf32_slovenian_ci", false}, + {165, "utf32", "utf32_polish_ci", false}, + {166, "utf32", "utf32_estonian_ci", false}, + {167, "utf32", "utf32_spanish_ci", false}, + {168, "utf32", "utf32_swedish_ci", false}, + {169, "utf32", "utf32_turkish_ci", false}, + {170, "utf32", "utf32_czech_ci", false}, + {171, "utf32", "utf32_danish_ci", false}, + {172, "utf32", "utf32_lithuanian_ci", false}, + {173, "utf32", "utf32_slovak_ci", false}, + {174, "utf32", "utf32_spanish2_ci", false}, + {175, "utf32", "utf32_roman_ci", false}, + {176, "utf32", "utf32_persian_ci", false}, + {177, "utf32", "utf32_esperanto_ci", false}, + {178, "utf32", "utf32_hungarian_ci", false}, + {179, "utf32", "utf32_sinhala_ci", false}, + {180, "utf32", "utf32_german2_ci", false}, + {181, "utf32", "utf32_croatian_ci", false}, + {182, "utf32", "utf32_unicode_520_ci", false}, + {183, "utf32", "utf32_vietnamese_ci", false}, + {192, "utf8", "utf8_unicode_ci", false}, + {193, "utf8", "utf8_icelandic_ci", false}, + {194, "utf8", "utf8_latvian_ci", false}, + {195, "utf8", "utf8_romanian_ci", false}, + {196, "utf8", "utf8_slovenian_ci", false}, + {197, "utf8", "utf8_polish_ci", false}, + {198, "utf8", "utf8_estonian_ci", false}, + {199, "utf8", "utf8_spanish_ci", false}, + {200, "utf8", "utf8_swedish_ci", false}, + {201, "utf8", "utf8_turkish_ci", false}, + {202, "utf8", "utf8_czech_ci", false}, + {203, "utf8", "utf8_danish_ci", false}, + {204, "utf8", "utf8_lithuanian_ci", false}, + {205, "utf8", "utf8_slovak_ci", false}, + {206, "utf8", "utf8_spanish2_ci", false}, + {207, "utf8", "utf8_roman_ci", false}, + {208, "utf8", "utf8_persian_ci", false}, + {209, "utf8", "utf8_esperanto_ci", false}, + {210, "utf8", "utf8_hungarian_ci", false}, + {211, "utf8", "utf8_sinhala_ci", false}, + {212, "utf8", "utf8_german2_ci", false}, + {213, "utf8", "utf8_croatian_ci", false}, + {214, "utf8", "utf8_unicode_520_ci", false}, + {215, "utf8", "utf8_vietnamese_ci", false}, + {223, "utf8", "utf8_general_mysql500_ci", false}, + {224, "utf8mb4", "utf8mb4_unicode_ci", false}, + {225, "utf8mb4", "utf8mb4_icelandic_ci", false}, + {226, "utf8mb4", "utf8mb4_latvian_ci", false}, + {227, "utf8mb4", "utf8mb4_romanian_ci", false}, + {228, "utf8mb4", "utf8mb4_slovenian_ci", false}, + {229, "utf8mb4", "utf8mb4_polish_ci", false}, + {230, "utf8mb4", "utf8mb4_estonian_ci", false}, + {231, "utf8mb4", "utf8mb4_spanish_ci", false}, + {232, "utf8mb4", "utf8mb4_swedish_ci", false}, + {233, "utf8mb4", "utf8mb4_turkish_ci", false}, + {234, "utf8mb4", "utf8mb4_czech_ci", false}, + {235, "utf8mb4", "utf8mb4_danish_ci", false}, + {236, "utf8mb4", "utf8mb4_lithuanian_ci", false}, + {237, "utf8mb4", "utf8mb4_slovak_ci", false}, + {238, "utf8mb4", "utf8mb4_spanish2_ci", false}, + {239, "utf8mb4", "utf8mb4_roman_ci", false}, + {240, "utf8mb4", "utf8mb4_persian_ci", false}, + {241, "utf8mb4", "utf8mb4_esperanto_ci", false}, + {242, "utf8mb4", "utf8mb4_hungarian_ci", false}, + {243, "utf8mb4", "utf8mb4_sinhala_ci", false}, + {244, "utf8mb4", "utf8mb4_german2_ci", false}, + {245, "utf8mb4", "utf8mb4_croatian_ci", false}, + {246, "utf8mb4", "utf8mb4_unicode_520_ci", false}, + {247, "utf8mb4", "utf8mb4_vietnamese_ci", false}, +} + +// init method always puts to the end of file. +func init() { + for _, c := range charsetInfos { + charsets[c.Name] = c + } + for _, c := range collations { + charset, ok := charsets[c.CharsetName] + if !ok { + continue + } + charset.Collations[c.Name] = c + } +} diff --git a/charset/charset_test.go b/charset/charset_test.go new file mode 100644 index 000000000..c400d97f1 --- /dev/null +++ b/charset/charset_test.go @@ -0,0 +1,94 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testCharsetSuite{}) + +type testCharsetSuite struct { +} + +func testValidCharset(c *C, charset string, collation string, expect bool) { + b := ValidCharsetAndCollation(charset, collation) + c.Assert(b, Equals, expect) +} + +func (s *testCharsetSuite) TestValidCharset(c *C) { + defer testleak.AfterTest(c)() + tests := []struct { + cs string + co string + succ bool + }{ + {"utf8", "utf8_general_ci", true}, + {"", "utf8_general_ci", true}, + {"utf8mb4", "utf8mb4_bin", true}, + {"latin1", "latin1_bin", true}, + {"utf8", "utf8_invalid_ci", false}, + {"utf16", "utf16_bin", false}, + {"gb2312", "gb2312_chinese_ci", false}, + } + for _, tt := range tests { + testValidCharset(c, tt.cs, tt.co, tt.succ) + } +} + +func (s *testCharsetSuite) TestGetAllCharsets(c *C) { + defer testleak.AfterTest(c)() + charset := &Charset{"test", "test_bin", nil, "Test", 5} + charsetInfos = append(charsetInfos, charset) + descs := GetAllCharsets() + c.Assert(len(descs), Equals, len(charsetInfos)-1) +} + +func testGetDefaultCollation(c *C, charset string, expectCollation string, succ bool) { + b, err := GetDefaultCollation(charset) + if !succ { + c.Assert(err, NotNil) + return + } + c.Assert(b, Equals, expectCollation) +} + +func (s *testCharsetSuite) TestGetDefaultCollation(c *C) { + defer testleak.AfterTest(c)() + tests := []struct { + cs string + co string + succ bool + }{ + {"utf8", "utf8_bin", true}, + {"UTF8", "utf8_bin", true}, + {"utf8mb4", "utf8mb4_bin", true}, + {"ascii", "ascii_bin", true}, + {"binary", "binary", true}, + {"latin1", "latin1_bin", true}, + {"invalid_cs", "", false}, + {"", "utf8_bin", false}, + } + for _, tt := range tests { + testGetDefaultCollation(c, tt.cs, tt.co, tt.succ) + } +} diff --git a/charset/encoding_table.go b/charset/encoding_table.go new file mode 100644 index 000000000..37a5550b7 --- /dev/null +++ b/charset/encoding_table.go @@ -0,0 +1,260 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "strings" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/encoding/korean" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/encoding/traditionalchinese" + "golang.org/x/text/encoding/unicode" +) + +// Lookup returns the encoding with the specified label, and its canonical +// name. It returns nil and the empty string if label is not one of the +// standard encodings for HTML. Matching is case-insensitive and ignores +// leading and trailing whitespace. +func Lookup(label string) (e encoding.Encoding, name string) { + label = strings.ToLower(strings.Trim(label, "\t\n\r\f ")) + enc := encodings[label] + return enc.e, enc.name +} + +var encodings = map[string]struct { + e encoding.Encoding + name string +}{ + "unicode-1-1-utf-8": {encoding.Nop, "utf-8"}, + "utf-8": {encoding.Nop, "utf-8"}, + "utf8": {encoding.Nop, "utf-8"}, + "utf8mb4": {encoding.Nop, "utf-8"}, + "binary": {encoding.Nop, "binary"}, + "866": {charmap.CodePage866, "ibm866"}, + "cp866": {charmap.CodePage866, "ibm866"}, + "csibm866": {charmap.CodePage866, "ibm866"}, + "ibm866": {charmap.CodePage866, "ibm866"}, + "csisolatin2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso-8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso-ir-101": {charmap.ISO8859_2, "iso-8859-2"}, + "iso8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso88592": {charmap.ISO8859_2, "iso-8859-2"}, + "iso_8859-2": {charmap.ISO8859_2, "iso-8859-2"}, + "iso_8859-2:1987": {charmap.ISO8859_2, "iso-8859-2"}, + "l2": {charmap.ISO8859_2, "iso-8859-2"}, + "latin2": {charmap.ISO8859_2, "iso-8859-2"}, + "csisolatin3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso-8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso-ir-109": {charmap.ISO8859_3, "iso-8859-3"}, + "iso8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso88593": {charmap.ISO8859_3, "iso-8859-3"}, + "iso_8859-3": {charmap.ISO8859_3, "iso-8859-3"}, + "iso_8859-3:1988": {charmap.ISO8859_3, "iso-8859-3"}, + "l3": {charmap.ISO8859_3, "iso-8859-3"}, + "latin3": {charmap.ISO8859_3, "iso-8859-3"}, + "csisolatin4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso-8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso-ir-110": {charmap.ISO8859_4, "iso-8859-4"}, + "iso8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso88594": {charmap.ISO8859_4, "iso-8859-4"}, + "iso_8859-4": {charmap.ISO8859_4, "iso-8859-4"}, + "iso_8859-4:1988": {charmap.ISO8859_4, "iso-8859-4"}, + "l4": {charmap.ISO8859_4, "iso-8859-4"}, + "latin4": {charmap.ISO8859_4, "iso-8859-4"}, + "csisolatincyrillic": {charmap.ISO8859_5, "iso-8859-5"}, + "cyrillic": {charmap.ISO8859_5, "iso-8859-5"}, + "iso-8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso-ir-144": {charmap.ISO8859_5, "iso-8859-5"}, + "iso8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso88595": {charmap.ISO8859_5, "iso-8859-5"}, + "iso_8859-5": {charmap.ISO8859_5, "iso-8859-5"}, + "iso_8859-5:1988": {charmap.ISO8859_5, "iso-8859-5"}, + "arabic": {charmap.ISO8859_6, "iso-8859-6"}, + "asmo-708": {charmap.ISO8859_6, "iso-8859-6"}, + "csiso88596e": {charmap.ISO8859_6, "iso-8859-6"}, + "csiso88596i": {charmap.ISO8859_6, "iso-8859-6"}, + "csisolatinarabic": {charmap.ISO8859_6, "iso-8859-6"}, + "ecma-114": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6-e": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-8859-6-i": {charmap.ISO8859_6, "iso-8859-6"}, + "iso-ir-127": {charmap.ISO8859_6, "iso-8859-6"}, + "iso8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso88596": {charmap.ISO8859_6, "iso-8859-6"}, + "iso_8859-6": {charmap.ISO8859_6, "iso-8859-6"}, + "iso_8859-6:1987": {charmap.ISO8859_6, "iso-8859-6"}, + "csisolatingreek": {charmap.ISO8859_7, "iso-8859-7"}, + "ecma-118": {charmap.ISO8859_7, "iso-8859-7"}, + "elot_928": {charmap.ISO8859_7, "iso-8859-7"}, + "greek": {charmap.ISO8859_7, "iso-8859-7"}, + "greek8": {charmap.ISO8859_7, "iso-8859-7"}, + "iso-8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso-ir-126": {charmap.ISO8859_7, "iso-8859-7"}, + "iso8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso88597": {charmap.ISO8859_7, "iso-8859-7"}, + "iso_8859-7": {charmap.ISO8859_7, "iso-8859-7"}, + "iso_8859-7:1987": {charmap.ISO8859_7, "iso-8859-7"}, + "sun_eu_greek": {charmap.ISO8859_7, "iso-8859-7"}, + "csiso88598e": {charmap.ISO8859_8, "iso-8859-8"}, + "csisolatinhebrew": {charmap.ISO8859_8, "iso-8859-8"}, + "hebrew": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-8859-8-e": {charmap.ISO8859_8, "iso-8859-8"}, + "iso-ir-138": {charmap.ISO8859_8, "iso-8859-8"}, + "iso8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso88598": {charmap.ISO8859_8, "iso-8859-8"}, + "iso_8859-8": {charmap.ISO8859_8, "iso-8859-8"}, + "iso_8859-8:1988": {charmap.ISO8859_8, "iso-8859-8"}, + "visual": {charmap.ISO8859_8, "iso-8859-8"}, + "csiso88598i": {charmap.ISO8859_8, "iso-8859-8-i"}, + "iso-8859-8-i": {charmap.ISO8859_8, "iso-8859-8-i"}, + "logical": {charmap.ISO8859_8, "iso-8859-8-i"}, + "csisolatin6": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-8859-10": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-ir-157": {charmap.ISO8859_10, "iso-8859-10"}, + "iso8859-10": {charmap.ISO8859_10, "iso-8859-10"}, + "iso885910": {charmap.ISO8859_10, "iso-8859-10"}, + "l6": {charmap.ISO8859_10, "iso-8859-10"}, + "latin6": {charmap.ISO8859_10, "iso-8859-10"}, + "iso-8859-13": {charmap.ISO8859_13, "iso-8859-13"}, + "iso8859-13": {charmap.ISO8859_13, "iso-8859-13"}, + "iso885913": {charmap.ISO8859_13, "iso-8859-13"}, + "iso-8859-14": {charmap.ISO8859_14, "iso-8859-14"}, + "iso8859-14": {charmap.ISO8859_14, "iso-8859-14"}, + "iso885914": {charmap.ISO8859_14, "iso-8859-14"}, + "csisolatin9": {charmap.ISO8859_15, "iso-8859-15"}, + "iso-8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "iso8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "iso885915": {charmap.ISO8859_15, "iso-8859-15"}, + "iso_8859-15": {charmap.ISO8859_15, "iso-8859-15"}, + "l9": {charmap.ISO8859_15, "iso-8859-15"}, + "iso-8859-16": {charmap.ISO8859_16, "iso-8859-16"}, + "cskoi8r": {charmap.KOI8R, "koi8-r"}, + "koi": {charmap.KOI8R, "koi8-r"}, + "koi8": {charmap.KOI8R, "koi8-r"}, + "koi8-r": {charmap.KOI8R, "koi8-r"}, + "koi8_r": {charmap.KOI8R, "koi8-r"}, + "koi8-u": {charmap.KOI8U, "koi8-u"}, + "csmacintosh": {charmap.Macintosh, "macintosh"}, + "mac": {charmap.Macintosh, "macintosh"}, + "macintosh": {charmap.Macintosh, "macintosh"}, + "x-mac-roman": {charmap.Macintosh, "macintosh"}, + "dos-874": {charmap.Windows874, "windows-874"}, + "iso-8859-11": {charmap.Windows874, "windows-874"}, + "iso8859-11": {charmap.Windows874, "windows-874"}, + "iso885911": {charmap.Windows874, "windows-874"}, + "tis-620": {charmap.Windows874, "windows-874"}, + "windows-874": {charmap.Windows874, "windows-874"}, + "cp1250": {charmap.Windows1250, "windows-1250"}, + "windows-1250": {charmap.Windows1250, "windows-1250"}, + "x-cp1250": {charmap.Windows1250, "windows-1250"}, + "cp1251": {charmap.Windows1251, "windows-1251"}, + "windows-1251": {charmap.Windows1251, "windows-1251"}, + "x-cp1251": {charmap.Windows1251, "windows-1251"}, + "ansi_x3.4-1968": {charmap.Windows1252, "windows-1252"}, + "ascii": {charmap.Windows1252, "windows-1252"}, + "cp1252": {charmap.Windows1252, "windows-1252"}, + "cp819": {charmap.Windows1252, "windows-1252"}, + "csisolatin1": {charmap.Windows1252, "windows-1252"}, + "ibm819": {charmap.Windows1252, "windows-1252"}, + "iso-8859-1": {charmap.Windows1252, "windows-1252"}, + "iso-ir-100": {charmap.Windows1252, "windows-1252"}, + "iso8859-1": {charmap.Windows1252, "windows-1252"}, + "iso88591": {charmap.Windows1252, "windows-1252"}, + "iso_8859-1": {charmap.Windows1252, "windows-1252"}, + "iso_8859-1:1987": {charmap.Windows1252, "windows-1252"}, + "l1": {charmap.Windows1252, "windows-1252"}, + "latin1": {charmap.Windows1252, "windows-1252"}, + "us-ascii": {charmap.Windows1252, "windows-1252"}, + "windows-1252": {charmap.Windows1252, "windows-1252"}, + "x-cp1252": {charmap.Windows1252, "windows-1252"}, + "cp1253": {charmap.Windows1253, "windows-1253"}, + "windows-1253": {charmap.Windows1253, "windows-1253"}, + "x-cp1253": {charmap.Windows1253, "windows-1253"}, + "cp1254": {charmap.Windows1254, "windows-1254"}, + "csisolatin5": {charmap.Windows1254, "windows-1254"}, + "iso-8859-9": {charmap.Windows1254, "windows-1254"}, + "iso-ir-148": {charmap.Windows1254, "windows-1254"}, + "iso8859-9": {charmap.Windows1254, "windows-1254"}, + "iso88599": {charmap.Windows1254, "windows-1254"}, + "iso_8859-9": {charmap.Windows1254, "windows-1254"}, + "iso_8859-9:1989": {charmap.Windows1254, "windows-1254"}, + "l5": {charmap.Windows1254, "windows-1254"}, + "latin5": {charmap.Windows1254, "windows-1254"}, + "windows-1254": {charmap.Windows1254, "windows-1254"}, + "x-cp1254": {charmap.Windows1254, "windows-1254"}, + "cp1255": {charmap.Windows1255, "windows-1255"}, + "windows-1255": {charmap.Windows1255, "windows-1255"}, + "x-cp1255": {charmap.Windows1255, "windows-1255"}, + "cp1256": {charmap.Windows1256, "windows-1256"}, + "windows-1256": {charmap.Windows1256, "windows-1256"}, + "x-cp1256": {charmap.Windows1256, "windows-1256"}, + "cp1257": {charmap.Windows1257, "windows-1257"}, + "windows-1257": {charmap.Windows1257, "windows-1257"}, + "x-cp1257": {charmap.Windows1257, "windows-1257"}, + "cp1258": {charmap.Windows1258, "windows-1258"}, + "windows-1258": {charmap.Windows1258, "windows-1258"}, + "x-cp1258": {charmap.Windows1258, "windows-1258"}, + "x-mac-cyrillic": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, + "x-mac-ukrainian": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, + "chinese": {simplifiedchinese.GBK, "gbk"}, + "csgb2312": {simplifiedchinese.GBK, "gbk"}, + "csiso58gb231280": {simplifiedchinese.GBK, "gbk"}, + "gb2312": {simplifiedchinese.GBK, "gbk"}, + "gb_2312": {simplifiedchinese.GBK, "gbk"}, + "gb_2312-80": {simplifiedchinese.GBK, "gbk"}, + "gbk": {simplifiedchinese.GBK, "gbk"}, + "iso-ir-58": {simplifiedchinese.GBK, "gbk"}, + "x-gbk": {simplifiedchinese.GBK, "gbk"}, + "gb18030": {simplifiedchinese.GB18030, "gb18030"}, + "hz-gb-2312": {simplifiedchinese.HZGB2312, "hz-gb-2312"}, + "big5": {traditionalchinese.Big5, "big5"}, + "big5-hkscs": {traditionalchinese.Big5, "big5"}, + "cn-big5": {traditionalchinese.Big5, "big5"}, + "csbig5": {traditionalchinese.Big5, "big5"}, + "x-x-big5": {traditionalchinese.Big5, "big5"}, + "cseucpkdfmtjapanese": {japanese.EUCJP, "euc-jp"}, + "euc-jp": {japanese.EUCJP, "euc-jp"}, + "x-euc-jp": {japanese.EUCJP, "euc-jp"}, + "csiso2022jp": {japanese.ISO2022JP, "iso-2022-jp"}, + "iso-2022-jp": {japanese.ISO2022JP, "iso-2022-jp"}, + "csshiftjis": {japanese.ShiftJIS, "shift_jis"}, + "ms_kanji": {japanese.ShiftJIS, "shift_jis"}, + "shift-jis": {japanese.ShiftJIS, "shift_jis"}, + "shift_jis": {japanese.ShiftJIS, "shift_jis"}, + "sjis": {japanese.ShiftJIS, "shift_jis"}, + "windows-31j": {japanese.ShiftJIS, "shift_jis"}, + "x-sjis": {japanese.ShiftJIS, "shift_jis"}, + "cseuckr": {korean.EUCKR, "euc-kr"}, + "csksc56011987": {korean.EUCKR, "euc-kr"}, + "euc-kr": {korean.EUCKR, "euc-kr"}, + "iso-ir-149": {korean.EUCKR, "euc-kr"}, + "korean": {korean.EUCKR, "euc-kr"}, + "ks_c_5601-1987": {korean.EUCKR, "euc-kr"}, + "ks_c_5601-1989": {korean.EUCKR, "euc-kr"}, + "ksc5601": {korean.EUCKR, "euc-kr"}, + "ksc_5601": {korean.EUCKR, "euc-kr"}, + "windows-949": {korean.EUCKR, "euc-kr"}, + "csiso2022kr": {encoding.Replacement, "replacement"}, + "iso-2022-kr": {encoding.Replacement, "replacement"}, + "iso-2022-cn": {encoding.Replacement, "replacement"}, + "iso-2022-cn-ext": {encoding.Replacement, "replacement"}, + "utf-16be": {unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), "utf-16be"}, + "utf-16": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, + "utf-16le": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, + "x-user-defined": {charmap.XUserDefined, "x-user-defined"}, +} diff --git a/consistent_test.go b/consistent_test.go new file mode 100644 index 000000000..387279213 --- /dev/null +++ b/consistent_test.go @@ -0,0 +1,108 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "io/ioutil" + "os" + "path" + "runtime" + "sort" + "strings" + + . "github.com/pingcap/check" +) + +var _ = Suite(&testConsistentSuite{}) + +type testConsistentSuite struct { +} + +func (s *testConsistentSuite) TestKeywordConsistent(c *C) { + _, filename, _, _ := runtime.Caller(0) + parserFilename := path.Join(path.Dir(filename), "parser.y") + parserFile, err := os.Open(parserFilename) + c.Assert(err, IsNil) + data, err := ioutil.ReadAll(parserFile) + c.Assert(err, IsNil) + content := string(data) + + reservedKeywordStartMarker := "\t/* The following tokens belong to ReservedKeyword. */" + unreservedKeywordStartMarker := "\t/* The following tokens belong to UnReservedKeyword. */" + notKeywordTokenStartMarker := "\t/* The following tokens belong to NotKeywordToken. */" + tidbKeywordStartMarker := "\t/* The following tokens belong to TiDBKeyword. */" + identTokenEndMarker := "%token\t" + + reservedKeywords := extractKeywords(content, reservedKeywordStartMarker, unreservedKeywordStartMarker) + + unreservedKeywords := extractKeywords(content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) + + notKeywordTokens := extractKeywords(content, notKeywordTokenStartMarker, tidbKeywordStartMarker) + + tidbKeywords := extractKeywords(content, tidbKeywordStartMarker, identTokenEndMarker) + + for k, v := range aliases { + c.Assert(k != v, IsTrue) + c.Assert(tokenMap[k], Equals, tokenMap[v]) + } + keywordCount := len(reservedKeywords) + len(unreservedKeywords) + len(notKeywordTokens) + len(tidbKeywords) + c.Assert(len(tokenMap)-len(aliases), Equals, keywordCount) + + unreservedCollectionDef := extractKeywordsFromCollectionDef(content, "\nUnReservedKeyword:") + c.Assert(unreservedKeywords, DeepEquals, unreservedCollectionDef) + + notKeywordTokensCollectionDef := extractKeywordsFromCollectionDef(content, "\nNotKeywordToken:") + c.Assert(notKeywordTokens, DeepEquals, notKeywordTokensCollectionDef) + + tidbKeywordsCollectionDef := extractKeywordsFromCollectionDef(content, "\nTiDBKeyword:") + c.Assert(tidbKeywords, DeepEquals, tidbKeywordsCollectionDef) +} + +func extractMiddle(str, startMarker, endMarker string) string { + startIdx := strings.Index(str, startMarker) + if startIdx == -1 { + return "" + } + str = str[startIdx+len(startMarker):] + endIdx := strings.Index(str, endMarker) + if endIdx == -1 { + return "" + } + return str[:endIdx] +} + +func extractQuotedWords(strs []string) []string { + var words []string + for _, str := range strs { + word := extractMiddle(str, "\"", "\"") + if word == "" { + continue + } + words = append(words, word) + } + sort.Strings(words) + return words +} + +func extractKeywords(content, startMarker, endMarker string) []string { + keywordSection := extractMiddle(content, startMarker, endMarker) + lines := strings.Split(keywordSection, "\n") + return extractQuotedWords(lines) +} + +func extractKeywordsFromCollectionDef(content, startMarker string) []string { + keywordSection := extractMiddle(content, startMarker, "\n\n") + words := strings.Split(keywordSection, "|") + return extractQuotedWords(words) +} diff --git a/format/format.go b/format/format.go new file mode 100644 index 000000000..0a14a6d36 --- /dev/null +++ b/format/format.go @@ -0,0 +1,195 @@ +// Copyright (c) 2014 The sortutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/STRUTIL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "fmt" + "io" +) + +const ( + st0 = iota + stBOL + stPERC + stBOLPERC +) + +// Formatter is an io.Writer extended formatter by a fmt.Printf like function Format. +type Formatter interface { + io.Writer + Format(format string, args ...interface{}) (n int, errno error) +} + +type indentFormatter struct { + io.Writer + indent []byte + indentLevel int + state int +} + +var replace = map[rune]string{ + '\000': "\\0", + '\'': "''", + '\n': "\\n", + '\r': "\\r", +} + +// IndentFormatter returns a new Formatter which interprets %i and %u in the +// Format() formats string as indent and unindent commands. The commands can +// nest. The Formatter writes to io.Writer 'w' and inserts one 'indent' +// string per current indent level value. +// Behaviour of commands reaching negative indent levels is undefined. +// IndentFormatter(os.Stdout, "\t").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// output: +// abc3%e +// x +// y +// z +// The Go quoted string literal form of the above is: +// "abc%%e\n\tx\n\tx\nz\n" +// The commands can be scattered between separate invocations of Format(), +// i.e. the formatter keeps track of the indent level and knows if it is +// positioned on start of a line and should emit indentation(s). +// The same output as above can be produced by e.g.: +// f := IndentFormatter(os.Stdout, " ") +// f.Format("abc%d%%e%i\nx\n", 3) +// f.Format("y\n%uz\n") +func IndentFormatter(w io.Writer, indent string) Formatter { + return &indentFormatter{w, []byte(indent), 0, stBOL} +} + +func (f *indentFormatter) format(flat bool, format string, args ...interface{}) (n int, errno error) { + var buf = make([]byte, 0) + for i := 0; i < len(format); i++ { + c := format[i] + switch f.state { + case st0: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + f.state = stBOL + case '%': + f.state = stPERC + default: + buf = append(buf, c) + } + case stBOL: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + case '%': + f.state = stBOLPERC + default: + if !flat { + for i := 0; i < f.indentLevel; i++ { + buf = append(buf, f.indent...) + } + } + buf = append(buf, c) + f.state = st0 + } + case stBOLPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = stBOL + case 'u': + f.indentLevel-- + f.state = stBOL + default: + if !flat { + for i := 0; i < f.indentLevel; i++ { + buf = append(buf, f.indent...) + } + } + buf = append(buf, '%', c) + f.state = st0 + } + case stPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = st0 + case 'u': + f.indentLevel-- + f.state = st0 + default: + buf = append(buf, '%', c) + f.state = st0 + } + default: + panic("unexpected state") + } + } + switch f.state { + case stPERC, stBOLPERC: + buf = append(buf, '%') + } + return f.Write([]byte(fmt.Sprintf(string(buf), args...))) +} + +// Format implements Format interface. +func (f *indentFormatter) Format(format string, args ...interface{}) (n int, errno error) { + return f.format(false, format, args...) +} + +type flatFormatter indentFormatter + +// FlatFormatter returns a newly created Formatter with the same functionality as the one returned +// by IndentFormatter except it allows a newline in the 'format' string argument of Format +// to pass through if the indent level is current zero. +// +// If the indent level is non-zero then such new lines are changed to a space character. +// There is no indent string, the %i and %u format verbs are used solely to determine the indent level. +// +// The FlatFormatter is intended for flattening of normally nested structure textual representation to +// a one top level structure per line form. +// FlatFormatter(os.Stdout, " ").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// output in the form of a Go quoted string literal: +// "abc3%%e x y z\n" +func FlatFormatter(w io.Writer) Formatter { + return (*flatFormatter)(IndentFormatter(w, "").(*indentFormatter)) +} + +// Format implements Format interface. +func (f *flatFormatter) Format(format string, args ...interface{}) (n int, errno error) { + return (*indentFormatter)(f).format(true, format, args...) +} + +// OutputFormat output escape character with backslash. +func OutputFormat(s string) string { + var buf bytes.Buffer + for _, old := range s { + if newVal, ok := replace[old]; ok { + buf.WriteString(newVal) + continue + } + buf.WriteRune(old) + } + + return buf.String() +} diff --git a/format/format_test.go b/format/format_test.go new file mode 100644 index 000000000..78cdcd72b --- /dev/null +++ b/format/format_test.go @@ -0,0 +1,60 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "io/ioutil" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testFormatSuite{}) + +type testFormatSuite struct { +} + +func checkFormat(c *C, f Formatter, buf *bytes.Buffer, str, expect string) { + _, err := f.Format(str, 3) + c.Assert(err, IsNil) + b, err := ioutil.ReadAll(buf) + c.Assert(err, IsNil) + c.Assert(string(b), Equals, expect) +} + +func (s *testFormatSuite) TestFormat(c *C) { + defer testleak.AfterTest(c)() + str := "abc%d%%e%i\nx\ny\n%uz\n" + buf := &bytes.Buffer{} + f := IndentFormatter(buf, "\t") + expect := `abc3%e + x + y +z +` + checkFormat(c, f, buf, str, expect) + + str = "abc%d%%e%i\nx\ny\n%uz\n%i\n" + buf = &bytes.Buffer{} + f = FlatFormatter(buf) + expect = "abc3%e x y z\n " + checkFormat(c, f, buf, str, expect) +} diff --git a/goyacc/main.go b/goyacc/main.go new file mode 100644 index 000000000..69da64b73 --- /dev/null +++ b/goyacc/main.go @@ -0,0 +1,819 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright 2014 The goyacc Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This source code uses portions of code previously published in the Go tool +// yacc[0] program, the respective license can be found in the LICENSE-GO-YACC +// file. + +// Goyacc is a version of yacc generating Go parsers. +// +// Usage +// +// Note: If no non flag arguments are given, goyacc reads standard input. +// +// goyacc [options] [input] +// +// options and (defaults) +// -c Report state closures. (false) +// -cr Check all states are reducible. (false) +// -dlval Debug value when runtime yyDebug >= 3. ("lval") +// -dlvalf Debug format of -dlval. ("%+v") +// -ex Explain how were conflicts resolved. (false) +// -l Disable line directives, for compatibility only - ignored. (false) +// -la Report all lookahead sets. (false) +// -o outputFile Parser output. ("y.go") +// -p prefix Name prefix to use in generated code. ("yy") +// -v reportFile Create grammar report. ("y.output") +// -xe examplesFile Generate error messages by examples. ("") +// -xegen examplesFile Generate a file suitable for -xe automatically from the grammar. +// The file must not exist. ("") +// +// +// +// Changelog +// +// 2015-03-24: The search for a custom error message is now extended to include +// also the last state that was shifted into, if any. This change resolves a +// problem in which a lookahead symbol is valid for a reduce action in state A, +// but the same symbol is later never accepted by any shift action in some +// state B which is popped from the state stack after the reduction is +// performed. The computed from example state is A but when the error is +// actually detected, the state is now B and the custom error was thus not +// used. +// +// 2015-02-23: Added -xegen flag. It can be used to automagically generate a +// skeleton errors by example file which can be, for example, edited and/or +// submited later as an argument of the -xe option. +// +// 2014-12-18: Support %precedence for better bison compatibility[3]. The +// actual changes are in packages goyacc is dependent on. Goyacc users should +// rebuild the binary: +// +// $ go get -u github.com/cznic/goyacc +// +// 2014-12-02: Added support for the optional yyLexerEx interface. The Reduced +// method can be useful for debugging and/or automatically producing examples +// by parsing code fragments. If it returns true the parser exits immediately +// with return value -1. +// +// Overview +// +// The generated parser is reentrant and mostly backwards compatible with +// parsers generated by go tool yacc[0]. yyParse expects to be given an +// argument that conforms to the following interface: +// +// type yyLexer interface { +// Lex(lval *yySymType) int +// Errorf(format string, a ...interface{}) +// Errors() []error +// } +// +// Optionally the argument to yyParse may implement the following interface: +// +// type yyLexerEx interface { +// yyLexer +// // Hook for recording a reduction. +// Reduced(rule, state int, lval *yySymType) (stop bool) // Client should copy *lval. +// } +// +// Lex should return the token identifier, and place other token information in +// lval (which replaces the usual yylval). Error is equivalent to yyerror in +// the original yacc. +// +// Code inside the parser may refer to the variable yylex, which holds the +// yyLexer passed to Parse. +// +// Multiple grammars compiled into a single program should be placed in +// distinct packages. If that is impossible, the "-p prefix" flag to yacc sets +// the prefix, by default yy, that begins the names of symbols, including +// types, the parser, and the lexer, generated and referenced by yacc's +// generated code. Setting it to distinct values allows multiple grammars to be +// placed in a single package. +// +// Differences wrt go tool yacc +// +// - goyacc implements ideas from "Generating LR Syntax Error Messages from +// Examples"[1]. Use the -xe flag to pass a name of the example file. For more +// details about the example format please see [2]. +// +// - The grammar report includes example token sequences leading to the +// particular state. Can help understanding conflicts. +// +// - Minor changes in parser debug output. +// +// Links +// +// Referenced from elsewhere: +// +// [0]: http://golang.org/cmd/yacc/ +// [1]: http://people.via.ecp.fr/~stilgar/doc/compilo/parser/Generating%20LR%20Syntax%20Error%20Messages.pdf +// [2]: http://godoc.org/github.com/cznic/y#hdr-Error_Examples +// [3]: http://www.gnu.org/software/bison/manual/html_node/Precedence-Only.html#Precedence-Only +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "go/scanner" + "go/token" + "io" + "io/ioutil" + "log" + "os" + "runtime" + "sort" + "strings" + + "github.com/cznic/mathutil" + "github.com/cznic/parser/yacc" + "github.com/cznic/sortutil" + "github.com/cznic/strutil" + "github.com/cznic/y" +) + +var ( + //oNoDefault = flag.Bool("nodefault", false, "disable generating $default actions") + oClosures = flag.Bool("c", false, "report state closures") + oReducible = flag.Bool("cr", false, "check all states are reducible") + oDlval = flag.String("dlval", "lval", "debug value (runtime yyDebug >= 3)") + oDlvalf = flag.String("dlvalf", "%+v", "debug format of -dlval (runtime yyDebug >= 3)") + oLA = flag.Bool("la", false, "report all lookahead sets") + oNoLines = flag.Bool("l", false, "disable line directives (for compatibility ony - ignored)") + oOut = flag.String("o", "y.go", "parser output") + oPref = flag.String("p", "yy", "name prefix to use in generated code") + oReport = flag.String("v", "y.output", "create grammar report") + oResolved = flag.Bool("ex", false, "explain how were conflicts resolved") + oXErrors = flag.String("xe", "", "generate eXtra errors from examples source file") + oXErrorsGen = flag.String("xegen", "", "generate error from examples source file automatically from the grammar") +) + +func main() { + log.SetFlags(0) + + defer func() { + _, file, line, ok := runtime.Caller(2) + if e := recover(); e != nil { + switch { + case ok: + log.Fatalf("%s:%d: panic: %v", file, line, e) + default: + log.Fatalf("panic: %v", e) + } + } + }() + + flag.Parse() + var in string + switch flag.NArg() { + case 0: + in = os.Stdin.Name() + case 1: + in = flag.Arg(0) + default: + log.Fatal("expected at most one non flag argument") + } + + if err := main1(in); err != nil { + switch x := err.(type) { + case scanner.ErrorList: + for _, v := range x { + fmt.Fprintf(os.Stderr, "%v\n", v) + } + os.Exit(1) + default: + log.Fatal(err) + } + } +} + +type symUsed struct { + sym *y.Symbol + used int +} + +type symsUsed []symUsed + +func (s symsUsed) Len() int { return len(s) } +func (s symsUsed) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func (s symsUsed) Less(i, j int) bool { + if s[i].used > s[j].used { + return true + } + + if s[i].used < s[j].used { + return false + } + + return strings.ToLower(s[i].sym.Name) < strings.ToLower(s[j].sym.Name) +} + +func main1(in string) (err error) { + var out io.Writer + if nm := *oOut; nm != "" { + var f *os.File + var e error + if f, err = os.Create(nm); err != nil { + return err + } + + defer func() { + if e1 := f.Close(); e1 != nil && err == nil { + err = e1 + } + }() + w := bufio.NewWriter(f) + defer func() { + if e1 := w.Flush(); e1 != nil && err == nil { + err = e1 + } + }() + buf := bytes.NewBuffer(nil) + out = buf + defer func() { + var dest []byte + if dest, e = format.Source(buf.Bytes()); e != nil { + dest = buf.Bytes() + } + + if _, e = w.Write(dest); e != nil && err == nil { + err = e + } + }() + } + + var rep io.Writer + if nm := *oReport; nm != "" { + f, err1 := os.Create(nm) + if err1 != nil { + return err1 + } + + defer func() { + if e := f.Close(); e != nil && err == nil { + err = e + } + }() + w := bufio.NewWriter(f) + defer func() { + if e := w.Flush(); e != nil && err == nil { + err = e + } + }() + rep = w + } + + var xerrors []byte + if nm := *oXErrors; nm != "" { + b, err1 := ioutil.ReadFile(nm) + if err1 != nil { + return err1 + } + + xerrors = b + } + + p, err := y.ProcessFile(token.NewFileSet(), in, &y.Options{ + //NoDefault: *oNoDefault, + AllowConflicts: true, + Closures: *oClosures, + LA: *oLA, + Reducible: *oReducible, + Report: rep, + Resolved: *oResolved, + XErrorsName: *oXErrors, + XErrorsSrc: xerrors, + }) + if err != nil { + return err + } + + if fn := *oXErrorsGen; fn != "" { + f, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return err + } + + b := bufio.NewWriter(f) + if err := p.SkeletonXErrors(b); err != nil { + return err + } + + if err := b.Flush(); err != nil { + return err + } + + if err := f.Close(); err != nil { + return err + } + } + + msu := make(map[*y.Symbol]int, len(p.Syms)) // sym -> usage + for nm, sym := range p.Syms { + if nm == "" || nm == "ε" || nm == "$accept" || nm == "#" { + continue + } + + msu[sym] = 0 + } + var minArg, maxArg int + for _, state := range p.Table { + for _, act := range state { + msu[act.Sym]++ + k, arg := act.Kind() + if k == 'a' { + continue + } + + if k == 'r' { + arg = -arg + } + minArg, maxArg = mathutil.Min(minArg, arg), mathutil.Max(maxArg, arg) + } + } + su := make(symsUsed, 0, len(msu)) + for sym, used := range msu { + su = append(su, symUsed{sym, used}) + } + sort.Sort(su) + + // ----------------------------------------------------------- Prologue + f := strutil.IndentFormatter(out, "\t") + mustFormat(f, "// CAUTION: Generated file - DO NOT EDIT.\n\n") + mustFormat(f, "%s", injectImport(p.Prologue)) + mustFormat(f, ` +type %[1]sSymType %i%s%u + +type %[1]sXError struct { + state, xsym int +} +`, *oPref, p.UnionSrc) + + // ---------------------------------------------------------- Constants + nsyms := map[string]*y.Symbol{} + a := make([]string, 0, len(msu)) + maxTokName := 0 + for sym := range msu { + nm := sym.Name + if nm == "$default" || nm == "$end" || sym.IsTerminal && nm[0] != '\'' && sym.Value > 0 { + maxTokName = mathutil.Max(maxTokName, len(nm)) + a = append(a, nm) + } + nsyms[nm] = sym + } + sort.Strings(a) + mustFormat(f, "\nconst (%i\n") + for _, v := range a { + nm := v + switch nm { + case "error": + nm = *oPref + "ErrCode" + case "$default": + nm = *oPref + "Default" + case "$end": + nm = *oPref + "EOFCode" + } + mustFormat(f, "%s%s = %d\n", nm, strings.Repeat(" ", maxTokName-len(nm)+1), nsyms[v].Value) + } + minArg-- // eg: [-13, 42], minArg -14 maps -13 to 1 so zero cell values -> empty. + mustFormat(f, "\n%sMaxDepth = 200\n", *oPref) + mustFormat(f, "%sTabOfs = %d\n", *oPref, minArg) + mustFormat(f, "%u)") + + // ---------------------------------------------------------- Variables + mustFormat(f, "\n\nvar (%i\n") + + // Lex translation table + mustFormat(f, "%sXLAT = map[int]int{%i\n", *oPref) + xlat := make(map[int]int, len(su)) + var errSym int + for i, v := range su { + if v.sym.Name == "error" { + errSym = i + } + xlat[v.sym.Value] = i + mustFormat(f, "%6d: %3d, // %s (%dx)\n", v.sym.Value, i, v.sym.Name, msu[v.sym]) + } + mustFormat(f, "%u}\n") + + // Symbol names + mustFormat(f, "\n%sSymNames = []string{%i\n", *oPref) + for _, v := range su { + mustFormat(f, "%q,\n", v.sym.Name) + } + mustFormat(f, "%u}\n") + + // Reduction table + mustFormat(f, "\n%sReductions = []struct{xsym, components int}{%i\n", *oPref) + for _, rule := range p.Rules { + mustFormat(f, "{%d, %d},\n", xlat[rule.Sym.Value], len(rule.Components)) + } + mustFormat(f, "%u}\n") + + // XError table + mustFormat(f, "\n%[1]sXErrors = map[%[1]sXError]string{%i\n", *oPref) + for _, xerr := range p.XErrors { + state := xerr.Stack[len(xerr.Stack)-1] + xsym := -1 + if xerr.Lookahead != nil { + xsym = xlat[xerr.Lookahead.Value] + } + mustFormat(f, "%[1]sXError{%d, %d}: \"%s\",\n", *oPref, state, xsym, xerr.Msg) + } + mustFormat(f, "%u}\n\n") + + // Parse table + tbits := 32 + switch n := mathutil.BitLen(maxArg - minArg + 1); { + case n < 8: + tbits = 8 + case n < 16: + tbits = 16 + } + mustFormat(f, "%sParseTab = [%d][]uint%d{%i\n", *oPref, len(p.Table), tbits) + nCells := 0 + var tabRow sortutil.Uint64Slice + for si, state := range p.Table { + tabRow = tabRow[:0] + max := 0 + for _, act := range state { + sym := act.Sym + xsym, ok := xlat[sym.Value] + if !ok { + panic("internal error 001") + } + + max = mathutil.Max(max, xsym) + kind, arg := act.Kind() + switch kind { + case 'a': + arg = 0 + case 'r': + arg *= -1 + } + tabRow = append(tabRow, uint64(xsym)<<32|uint64(arg-minArg)) + } + nCells += max + tabRow.Sort() + col := -1 + if si%5 == 0 { + mustFormat(f, "// %d\n", si) + } + mustFormat(f, "{") + for i, v := range tabRow { + xsym := int(uint32(v >> 32)) + arg := int(uint32(v)) + if col+1 != xsym { + mustFormat(f, "%d: ", xsym) + } + switch { + case i == len(tabRow)-1: + mustFormat(f, "%d", arg) + default: + mustFormat(f, "%d, ", arg) + } + col = xsym + } + mustFormat(f, "},\n") + } + mustFormat(f, "%u}\n") + fmt.Fprintf(os.Stderr, "Parse table entries: %d of %d, x %d bits == %d bytes\n", nCells, len(p.Table)*len(msu), tbits, nCells*tbits/8) + if n := p.ConflictsSR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d shift/reduce\n", n) + } + if n := p.ConflictsRR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d reduce/reduce\n", n) + } + + mustFormat(f, `%u) + +var %[1]sDebug = 0 + +type %[1]sLexer interface { + Lex(lval *%[1]sSymType) int + Errorf(format string, a ...interface{}) + Errors() []error +} + +type %[1]sLexerEx interface { + %[1]sLexer + Reduced(rule, state int, lval *%[1]sSymType) bool +} + +func %[1]sSymName(c int) (s string) { + x, ok := %[1]sXLAT[c] + if ok { + return %[1]sSymNames[x] + } + + return __yyfmt__.Sprintf("%%d", c) +} + +func %[1]slex1(yylex %[1]sLexer, lval *%[1]sSymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = %[1]sEOFCode + } + if %[1]sDebug >= 3 { + __yyfmt__.Printf("\nlex %%s(%%#x %%d), %[4]s: %[3]s\n", %[1]sSymName(n), n, n, %[4]s) + } + return n +} + +func %[1]sParse(yylex %[1]sLexer, parser *Parser) int { + const yyError = %[2]d + + yyEx, _ := yylex.(%[1]sLexerEx) + var yyn int + parser.yylval = %[1]sSymType{} + parser.yyVAL = %[1]sSymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if %[1]sDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + yyS[yyp] = parser.yyVAL + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = %[1]slex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = %[1]sXLAT[yychar]; !ok { + yyxchar = len(%[1]sSymNames) // > tab width + } + } + if %[1]sDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %%v\n", a) + } + row := %[1]sParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += %[1]sTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if %[1]sDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %%d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if %[1]sDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if %[1]sDebug >= 1 { + __yyfmt__.Printf("no action for %%s in state %%d\n", %[1]sSymName(yychar), yystate) + } + msg, ok := %[1]sXErrors[%[1]sXError{yystate, yyxchar}] + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.Errorf("") + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := %[1]sParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError])+%[1]sTabOfs + if yyn > 0 { // hit + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %%d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %%d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery discards %%s\n", %[1]sSymName(yychar)) + } + if yychar == %[1]sEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := %[1]sReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(%[1]sParseTab[yyS[yyp].yys][x])+%[1]sTabOfs + /* reduction by production r */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("reduce using rule %%v (%%s), and goto state %%d\n", r, %[1]sSymNames[x], yystate) + } + + switch r {%i +`, + *oPref, errSym, *oDlvalf, *oDlval) + for r, rule := range p.Rules { + if rule.Action == nil { + continue + } + + action := rule.Action.Values + if len(action) == 0 { + continue + } + + if len(action) == 1 { + part := action[0] + if part.Type == parser.ActionValueGo { + src := part.Src + src = src[1 : len(src)-1] // Remove lead '{' and trail '}' + if strings.TrimSpace(src) == "" { + continue + } + } + } + + components := rule.Components + typ := rule.Sym.Type + max := len(components) + if p1 := rule.Parent; p1 != nil { + max = rule.MaxParentDlr + components = p1.Components + } + mustFormat(f, "case %d: ", r) + for _, part := range action { + num := part.Num + switch part.Type { + case parser.ActionValueGo: + mustFormat(f, "%s", part.Src) + case parser.ActionValueDlrDlr: + mustFormat(f, "parser.yyVAL.%s", typ) + if typ == "" { + panic("internal error 002") + } + case parser.ActionValueDlrNum: + typ := p.Syms[components[num-1]].Type + if typ == "" { + panic("internal error 003") + } + mustFormat(f, "yyS[yypt-%d].%s", max-num, typ) + case parser.ActionValueDlrTagDlr: + mustFormat(f, "parser.yyVAL.%s", part.Tag) + case parser.ActionValueDlrTagNum: + mustFormat(f, "yyS[yypt-%d].%s", max-num, part.Tag) + } + } + mustFormat(f, "\n") + } + mustFormat(f, `%u + } + + if yyEx != nil && yyEx.Reduced(r, exState, &parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} + +%[2]s +`, *oPref, p.Tail) + _ = oNoLines //TODO Ignored for now + return nil +} + +func injectImport(src string) string { + const inj = ` + +import __yyfmt__ "fmt" +` + fset := token.NewFileSet() + file := fset.AddFile("", -1, len(src)) + var s scanner.Scanner + s.Init( + file, + []byte(src), + nil, + scanner.ScanComments, + ) + for { + switch _, tok, _ := s.Scan(); tok { + case token.EOF: + return inj + src + case token.PACKAGE: + s.Scan() // ident + pos, _, _ := s.Scan() + ofs := file.Offset(pos) + return src[:ofs] + inj + src[ofs:] + } + } +} + +func mustFormat(f strutil.Formatter, format string, args ...interface{}) { + _, err := f.Format(format, args...) + if err != nil { + log.Fatalf("format error %v", err) + } +} diff --git a/lexer.go b/lexer.go new file mode 100644 index 000000000..beabc37c6 --- /dev/null +++ b/lexer.go @@ -0,0 +1,785 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "bytes" + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "github.com/pingcap/parser/mysql" +) + +var _ = yyLexer(&Scanner{}) + +// Pos represents the position of a token. +type Pos struct { + Line int + Col int + Offset int +} + +// Scanner implements the yyLexer interface. +type Scanner struct { + r reader + buf bytes.Buffer + + errs []error + stmtStartPos int + + // For scanning such kind of comment: /*! MySQL-specific code */ or /*+ optimizer hint */ + specialComment specialCommentScanner + + sqlMode mysql.SQLMode +} + +type specialCommentScanner interface { + scan() (tok int, pos Pos, lit string) +} + +type mysqlSpecificCodeScanner struct { + *Scanner + Pos +} + +func (s *mysqlSpecificCodeScanner) scan() (tok int, pos Pos, lit string) { + tok, pos, lit = s.Scanner.scan() + pos.Line += s.Pos.Line + pos.Col += s.Pos.Col + pos.Offset += s.Pos.Offset + return +} + +type optimizerHintScanner struct { + *Scanner + Pos + end bool +} + +func (s *optimizerHintScanner) scan() (tok int, pos Pos, lit string) { + tok, pos, lit = s.Scanner.scan() + pos.Line += s.Pos.Line + pos.Col += s.Pos.Col + pos.Offset += s.Pos.Offset + if tok == 0 { + if !s.end { + tok = hintEnd + s.end = true + } + } + return +} + +// Errors returns the errors during a scan. +func (s *Scanner) Errors() []error { + return s.errs +} + +// reset resets the sql string to be scanned. +func (s *Scanner) reset(sql string) { + s.r = reader{s: sql, p: Pos{Line: 1}} + s.buf.Reset() + s.errs = s.errs[:0] + s.stmtStartPos = 0 + s.specialComment = nil +} + +func (s *Scanner) stmtText() string { + endPos := s.r.pos().Offset + if s.r.s[endPos-1] == '\n' { + endPos = endPos - 1 // trim new line + } + if s.r.s[s.stmtStartPos] == '\n' { + s.stmtStartPos++ + } + + text := s.r.s[s.stmtStartPos:endPos] + + s.stmtStartPos = endPos + return text +} + +// Errorf tells scanner something is wrong. +// Scanner satisfies yyLexer interface which need this function. +func (s *Scanner) Errorf(format string, a ...interface{}) { + str := fmt.Sprintf(format, a...) + val := s.r.s[s.r.pos().Offset:] + if len(val) > 2048 { + val = val[:2048] + } + err := fmt.Errorf("line %d column %d near \"%s\"%s (total length %d)", s.r.p.Line, s.r.p.Col, val, str, len(s.r.s)) + s.errs = append(s.errs, err) +} + +// Lex returns a token and store the token value in v. +// Scanner satisfies yyLexer interface. +// 0 and invalid are special token id this function would return: +// return 0 tells parser that scanner meets EOF, +// return invalid tells parser that scanner meets illegal character. +func (s *Scanner) Lex(v *yySymType) int { + tok, pos, lit := s.scan() + v.offset = pos.Offset + v.ident = lit + if tok == identifier { + tok = handleIdent(v) + } + if tok == identifier { + if tok1 := s.isTokenIdentifier(lit, pos.Offset); tok1 != 0 { + tok = tok1 + } + } + if s.sqlMode.HasANSIQuotesMode() && + tok == stringLit && + s.r.s[v.offset] == '"' { + tok = identifier + } + + if tok == pipes && !(s.sqlMode.HasPipesAsConcatMode()) { + return pipesAsOr + } + + if tok == not && s.sqlMode.HasHighNotPrecedenceMode() { + return not2 + } + + switch tok { + case intLit: + return toInt(s, v, lit) + case floatLit: + return toFloat(s, v, lit) + case decLit: + return toDecimal(s, v, lit) + case hexLit: + return toHex(s, v, lit) + case bitLit: + return toBit(s, v, lit) + case singleAtIdentifier, doubleAtIdentifier, cast, extract: + v.item = lit + return tok + case null: + v.item = nil + case quotedIdentifier: + tok = identifier + } + if tok == unicode.ReplacementChar && s.r.eof() { + return 0 + } + return tok +} + +// SetSQLMode sets the SQL mode for scanner. +func (s *Scanner) SetSQLMode(mode mysql.SQLMode) { + s.sqlMode = mode +} + +// GetSQLMode return the SQL mode of scanner. +func (s *Scanner) GetSQLMode() mysql.SQLMode { + return s.sqlMode +} + +// NewScanner returns a new scanner object. +func NewScanner(s string) *Scanner { + return &Scanner{r: reader{s: s}} +} + +func (s *Scanner) skipWhitespace() rune { + return s.r.incAsLongAs(unicode.IsSpace) +} + +func (s *Scanner) scan() (tok int, pos Pos, lit string) { + if s.specialComment != nil { + // Enter specialComment scan mode. + // for scanning such kind of comment: /*! MySQL-specific code */ + specialComment := s.specialComment + tok, pos, lit = specialComment.scan() + if tok != 0 { + // return the specialComment scan result as the result + return + } + // leave specialComment scan mode after all stream consumed. + s.specialComment = nil + } + + ch0 := s.r.peek() + if unicode.IsSpace(ch0) { + ch0 = s.skipWhitespace() + } + pos = s.r.pos() + if s.r.eof() { + // when scanner meets EOF, the returned token should be 0, + // because 0 is a special token id to remind the parser that stream is end. + return 0, pos, "" + } + + if !s.r.eof() && isIdentExtend(ch0) { + return scanIdentifier(s) + } + + // search a trie to get a token. + node := &ruleTable + for ch0 >= 0 && ch0 <= 255 { + if node.childs[ch0] == nil || s.r.eof() { + break + } + node = node.childs[ch0] + if node.fn != nil { + return node.fn(s) + } + s.r.inc() + ch0 = s.r.peek() + } + + tok, lit = node.token, s.r.data(&pos) + return +} + +func startWithXx(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanHex() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = hexLit, s.r.data(&pos) + } else { + tok = unicode.ReplacementChar + } + return + } + s.r.incAsLongAs(isIdentChar) + tok, lit = identifier, s.r.data(&pos) + return +} + +func startWithNn(s *Scanner) (tok int, pos Pos, lit string) { + tok, pos, lit = scanIdentifier(s) + // The National Character Set, N'some text' or n'some test'. + // See https://dev.mysql.com/doc/refman/5.7/en/string-literals.html + // and https://dev.mysql.com/doc/refman/5.7/en/charset-national.html + if lit == "N" || lit == "n" { + if s.r.peek() == '\'' { + tok = underscoreCS + lit = "utf8" + } + } + return +} + +func startWithBb(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanBit() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = bitLit, s.r.data(&pos) + } else { + tok = unicode.ReplacementChar + } + return + } + s.r.incAsLongAs(isIdentChar) + tok, lit = identifier, s.r.data(&pos) + return +} + +func startWithSharp(s *Scanner) (tok int, pos Pos, lit string) { + s.r.incAsLongAs(func(ch rune) bool { + return ch != '\n' + }) + return s.scan() +} + +func startWithDash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + if strings.HasPrefix(s.r.s[pos.Offset:], "--") { + remainLen := len(s.r.s[pos.Offset:]) + if remainLen == 2 || (remainLen > 2 && unicode.IsSpace(rune(s.r.s[pos.Offset+2]))) { + s.r.incAsLongAs(func(ch rune) bool { + return ch != '\n' + }) + return s.scan() + } + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->>") { + tok = juss + s.r.incN(3) + return + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->") { + tok = jss + s.r.incN(2) + return + } + tok = int('-') + s.r.inc() + return +} + +func startWithSlash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + ch0 := s.r.peek() + if ch0 == '*' { + s.r.inc() + startWithAsterisk := false + for { + ch0 = s.r.readByte() + if startWithAsterisk && ch0 == '/' { + // Meets */, means comment end. + break + } else if ch0 == '*' { + startWithAsterisk = true + } else { + startWithAsterisk = false + } + + if ch0 == unicode.ReplacementChar && s.r.eof() { + // unclosed comment + s.errs = append(s.errs, ParseErrorWith(s.r.data(&pos), s.r.p.Line)) + return + } + + } + + comment := s.r.data(&pos) + + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html + if strings.HasPrefix(comment, "/*+") { + begin := sqlOffsetInComment(comment) + end := len(comment) - 2 + sql := comment[begin:end] + s.specialComment = &optimizerHintScanner{ + Scanner: NewScanner(sql), + Pos: Pos{ + pos.Line, + pos.Col, + pos.Offset + begin, + }, + } + + tok = hintBegin + return + } + + // See http://dev.mysql.com/doc/refman/5.7/en/comments.html + // Convert "/*!VersionNumber MySQL-specific-code */" to "MySQL-specific-code". + if strings.HasPrefix(comment, "/*!") { + sql := specCodePattern.ReplaceAllStringFunc(comment, TrimComment) + s.specialComment = &mysqlSpecificCodeScanner{ + Scanner: NewScanner(sql), + Pos: Pos{ + pos.Line, + pos.Col, + pos.Offset + sqlOffsetInComment(comment), + }, + } + } + + return s.scan() + } + tok = int('/') + return +} + +func sqlOffsetInComment(comment string) int { + // find the first SQL token offset in pattern like "/*!40101 mysql specific code */" + offset := 0 + for i := 0; i < len(comment); i++ { + if unicode.IsSpace(rune(comment[i])) { + offset = i + break + } + } + for offset < len(comment) { + offset++ + if !unicode.IsSpace(rune(comment[offset])) { + break + } + } + return offset +} + +func startWithAt(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + ch1 := s.r.peek() + if ch1 == '\'' || ch1 == '"' { + nTok, nPos, nLit := startString(s) + if nTok == stringLit { + tok = singleAtIdentifier + pos = nPos + lit = nLit + } else { + tok = int('@') + } + } else if ch1 == '`' { + nTok, nPos, nLit := scanQuotedIdent(s) + if nTok == quotedIdentifier { + tok = singleAtIdentifier + pos = nPos + lit = nLit + } else { + tok = int('@') + } + } else if isUserVarChar(ch1) { + s.r.incAsLongAs(isUserVarChar) + tok, lit = singleAtIdentifier, s.r.data(&pos) + } else if ch1 == '@' { + s.r.inc() + stream := s.r.s[pos.Offset+2:] + for _, v := range []string{"global.", "session.", "local."} { + if len(v) > len(stream) { + continue + } + if strings.EqualFold(stream[:len(v)], v) { + s.r.incN(len(v)) + break + } + } + s.r.incAsLongAs(isIdentChar) + tok, lit = doubleAtIdentifier, s.r.data(&pos) + } else { + tok, lit = singleAtIdentifier, s.r.data(&pos) + } + return +} + +func scanIdentifier(s *Scanner) (int, Pos, string) { + pos := s.r.pos() + s.r.inc() + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) +} + +var ( + quotedIdentifier = -identifier +) + +func scanQuotedIdent(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + s.buf.Reset() + for { + ch := s.r.readByte() + if ch == unicode.ReplacementChar && s.r.eof() { + tok = unicode.ReplacementChar + return + } + if ch == '`' { + if s.r.peek() != '`' { + // don't return identifier in case that it's interpreted as keyword token later. + tok, lit = quotedIdentifier, s.buf.String() + return + } + s.r.inc() + } + s.buf.WriteRune(ch) + } +} + +func startString(s *Scanner) (tok int, pos Pos, lit string) { + return s.scanString() +} + +// lazyBuf is used to avoid allocation if possible. +// it has a useBuf field indicates whether bytes.Buffer is necessary. if +// useBuf is false, we can avoid calling bytes.Buffer.String(), which +// make a copy of data and cause allocation. +type lazyBuf struct { + useBuf bool + r *reader + b *bytes.Buffer + p *Pos +} + +func (mb *lazyBuf) setUseBuf(str string) { + if !mb.useBuf { + mb.useBuf = true + mb.b.Reset() + mb.b.WriteString(str) + } +} + +func (mb *lazyBuf) writeRune(r rune, w int) { + if mb.useBuf { + if w > 1 { + mb.b.WriteRune(r) + } else { + mb.b.WriteByte(byte(r)) + } + } +} + +func (mb *lazyBuf) data() string { + var lit string + if mb.useBuf { + lit = mb.b.String() + } else { + lit = mb.r.data(mb.p) + lit = lit[1 : len(lit)-1] + } + return lit +} + +func (s *Scanner) scanString() (tok int, pos Pos, lit string) { + tok, pos = stringLit, s.r.pos() + mb := lazyBuf{false, &s.r, &s.buf, &pos} + ending := s.r.readByte() + ch0 := s.r.peek() + for !s.r.eof() { + if ch0 == ending { + s.r.inc() + if s.r.peek() != ending { + lit = mb.data() + return + } + str := mb.r.data(&pos) + mb.setUseBuf(str[1 : len(str)-1]) + } else if ch0 == '\\' && !s.sqlMode.HasNoBackslashEscapesMode() { + mb.setUseBuf(mb.r.data(&pos)[1:]) + ch0 = handleEscape(s) + } + mb.writeRune(ch0, s.r.w) + if !s.r.eof() { + s.r.inc() + ch0 = s.r.peek() + } + } + + tok = unicode.ReplacementChar + return +} + +// handleEscape handles the case in scanString when previous char is '\'. +func handleEscape(s *Scanner) rune { + s.r.inc() + ch0 := s.r.peek() + /* + \" \' \\ \n \0 \b \Z \r \t ==> escape to one char + \% \_ ==> preserve both char + other ==> remove \ + */ + switch ch0 { + case 'n': + ch0 = '\n' + case '0': + ch0 = 0 + case 'b': + ch0 = 8 + case 'Z': + ch0 = 26 + case 'r': + ch0 = '\r' + case 't': + ch0 = '\t' + case '%', '_': + s.buf.WriteByte('\\') + } + return ch0 +} + +func startWithNumber(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + tok = intLit + ch0 := s.r.readByte() + if ch0 == '0' { + tok = intLit + ch1 := s.r.peek() + switch { + case ch1 >= '0' && ch1 <= '7': + s.r.inc() + s.scanOct() + case ch1 == 'x' || ch1 == 'X': + s.r.inc() + s.scanHex() + tok = hexLit + case ch1 == 'b': + s.r.inc() + s.scanBit() + tok = bitLit + case ch1 == '.': + return s.scanFloat(&pos) + case ch1 == 'B': + tok = unicode.ReplacementChar + return + } + } + + s.scanDigits() + ch0 = s.r.peek() + if ch0 == '.' || ch0 == 'e' || ch0 == 'E' { + return s.scanFloat(&pos) + } + + // Identifiers may begin with a digit but unless quoted may not consist solely of digits. + if !s.r.eof() && isIdentChar(ch0) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + lit = s.r.data(&pos) + return +} + +func startWithDot(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + save := s.r.pos() + if isDigit(s.r.peek()) { + tok, _, lit = s.scanFloat(&pos) + if s.r.eof() || !isIdentChar(s.r.peek()) { + return + } + // Fail to parse a float, reset to dot. + s.r.p = save + } + tok, lit = int('.'), "." + return +} + +func (s *Scanner) scanOct() { + s.r.incAsLongAs(func(ch rune) bool { + return ch >= '0' && ch <= '7' + }) +} + +func (s *Scanner) scanHex() { + s.r.incAsLongAs(func(ch rune) bool { + return ch >= '0' && ch <= '9' || + ch >= 'a' && ch <= 'f' || + ch >= 'A' && ch <= 'F' + }) +} + +func (s *Scanner) scanBit() { + s.r.incAsLongAs(func(ch rune) bool { + return ch == '0' || ch == '1' + }) +} + +func (s *Scanner) scanFloat(beg *Pos) (tok int, pos Pos, lit string) { + s.r.p = *beg + // float = D1 . D2 e D3 + s.scanDigits() + ch0 := s.r.peek() + if ch0 == '.' { + s.r.inc() + s.scanDigits() + ch0 = s.r.peek() + } + if ch0 == 'e' || ch0 == 'E' { + s.r.inc() + ch0 = s.r.peek() + if ch0 == '-' || ch0 == '+' { + s.r.inc() + } + s.scanDigits() + tok = floatLit + } else { + tok = decLit + } + pos, lit = *beg, s.r.data(beg) + return +} + +func (s *Scanner) scanDigits() string { + pos := s.r.pos() + s.r.incAsLongAs(isDigit) + return s.r.data(&pos) +} + +type reader struct { + s string + p Pos + w int +} + +var eof = Pos{-1, -1, -1} + +func (r *reader) eof() bool { + return r.p.Offset >= len(r.s) +} + +// peek() peeks a rune from underlying reader. +// if reader meets EOF, it will return unicode.ReplacementChar. to distinguish from +// the real unicode.ReplacementChar, the caller should call r.eof() again to check. +func (r *reader) peek() rune { + if r.eof() { + return unicode.ReplacementChar + } + v, w := rune(r.s[r.p.Offset]), 1 + switch { + case v == 0: + r.w = w + return v // illegal UTF-8 encoding + case v >= 0x80: + v, w = utf8.DecodeRuneInString(r.s[r.p.Offset:]) + if v == utf8.RuneError && w == 1 { + v = rune(r.s[r.p.Offset]) // illegal UTF-8 encoding + } + } + r.w = w + return v +} + +// inc increase the position offset of the reader. +// peek must be called before calling inc! +func (r *reader) inc() { + if r.s[r.p.Offset] == '\n' { + r.p.Line++ + r.p.Col = 0 + } + r.p.Offset += r.w + r.p.Col++ +} + +func (r *reader) incN(n int) { + for i := 0; i < n; i++ { + r.inc() + } +} + +func (r *reader) readByte() (ch rune) { + ch = r.peek() + if ch == unicode.ReplacementChar && r.eof() { + return + } + r.inc() + return +} + +func (r *reader) pos() Pos { + return r.p +} + +func (r *reader) data(from *Pos) string { + return r.s[from.Offset:r.p.Offset] +} + +func (r *reader) incAsLongAs(fn func(rune) bool) rune { + for { + ch := r.peek() + if !fn(ch) { + return ch + } + if ch == unicode.ReplacementChar && r.eof() { + return 0 + } + r.inc() + } +} diff --git a/lexer_test.go b/lexer_test.go new file mode 100644 index 000000000..122e5d3e6 --- /dev/null +++ b/lexer_test.go @@ -0,0 +1,351 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "fmt" + "unicode" + + . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" +) + +var _ = Suite(&testLexerSuite{}) + +type testLexerSuite struct { +} + +func (s *testLexerSuite) TestTokenID(c *C) { + for str, tok := range tokenMap { + l := NewScanner(str) + var v yySymType + tok1 := l.Lex(&v) + c.Check(tok, Equals, tok1) + } +} + +func (s *testLexerSuite) TestSingleChar(c *C) { + table := []byte{'|', '&', '-', '+', '*', '/', '%', '^', '~', '(', ',', ')'} + for _, tok := range table { + l := NewScanner(string(tok)) + var v yySymType + tok1 := l.Lex(&v) + c.Check(int(tok), Equals, tok1) + } +} + +type testCaseItem struct { + str string + tok int +} + +func (s *testLexerSuite) TestSingleCharOther(c *C) { + table := []testCaseItem{ + {"AT", identifier}, + {"?", paramMarker}, + {"PLACEHOLDER", identifier}, + {"=", eq}, + {".", int('.')}, + } + runTest(c, table) +} + +func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { + table := []testCaseItem{ + {"@", singleAtIdentifier}, + {"@''", singleAtIdentifier}, + {"@1", singleAtIdentifier}, + {"@.1_", singleAtIdentifier}, + {"@-1.", singleAtIdentifier}, + {"@~", singleAtIdentifier}, + {"@$", singleAtIdentifier}, + {"@a_3cbbc", singleAtIdentifier}, + {"@`a_3cbbc`", singleAtIdentifier}, + {"@-3cbbc", singleAtIdentifier}, + {"@!3cbbc", singleAtIdentifier}, + {"@@global.test", doubleAtIdentifier}, + {"@@session.test", doubleAtIdentifier}, + {"@@local.test", doubleAtIdentifier}, + {"@@test", doubleAtIdentifier}, + } + runTest(c, table) +} + +func (s *testLexerSuite) TestUnderscoreCS(c *C) { + var v yySymType + scanner := NewScanner(`_utf8"string"`) + tok := scanner.Lex(&v) + c.Check(tok, Equals, underscoreCS) + tok = scanner.Lex(&v) + c.Check(tok, Equals, stringLit) + + scanner.reset("N'string'") + tok = scanner.Lex(&v) + c.Check(tok, Equals, underscoreCS) + tok = scanner.Lex(&v) + c.Check(tok, Equals, stringLit) +} + +func (s *testLexerSuite) TestLiteral(c *C) { + table := []testCaseItem{ + {`'''a'''`, stringLit}, + {`''a''`, stringLit}, + {`""a""`, stringLit}, + {`\'a\'`, int('\\')}, + {`\"a\"`, int('\\')}, + {"0.2314", decLit}, + {"1234567890123456789012345678901234567890", decLit}, + {"132.313", decLit}, + {"132.3e231", floatLit}, + {"132.3e-231", floatLit}, + {"23416", intLit}, + {"123test", identifier}, + {"123" + string(unicode.ReplacementChar) + "xxx", identifier}, + {"0", intLit}, + {"0x3c26", hexLit}, + {"x'13181C76734725455A'", hexLit}, + {"0b01", bitLit}, + {fmt.Sprintf("t1%c", 0), identifier}, + {"N'some text'", underscoreCS}, + {"n'some text'", underscoreCS}, + {"\\N", null}, + {".*", int('.')}, // `.`, `*` + {".1_t_1_x", int('.')}, // `.`, `1_t_1_x` + // Issue #3954 + {".1e23", floatLit}, // `.1e23` + {".123", decLit}, // `.123` + {".1*23", decLit}, // `.1`, `*`, `23` + {".1,23", decLit}, // `.1`, `,`, `23` + {".1 23", decLit}, // `.1`, `23` + // TODO: See #3963. The following test cases do not test the ambiguity. + {".1$23", int('.')}, // `.`, `1$23` + {".1a23", int('.')}, // `.`, `1a23` + {".1e23$23", int('.')}, // `.`, `1e23$23` + {".1e23a23", int('.')}, // `.`, `1e23a23` + {".1C23", int('.')}, // `.`, `1C23` + {".1\u0081", int('.')}, // `.`, `1\u0081` + {".1\uff34", int('.')}, // `.`, `1\uff34` + {`b''`, bitLit}, + {`b'0101'`, bitLit}, + {`0b0101`, bitLit}, + } + runTest(c, table) +} + +func runTest(c *C, table []testCaseItem) { + var val yySymType + for _, v := range table { + l := NewScanner(v.str) + tok := l.Lex(&val) + c.Check(tok, Equals, v.tok, Commentf(v.str)) + } +} + +func (s *testLexerSuite) TestComment(c *C) { + + table := []testCaseItem{ + {"-- select --\n1", intLit}, + {"/*!40101 SET character_set_client = utf8 */;", set}, + {"/*+ BKA(t1) */", hintBegin}, + {"/* SET character_set_client = utf8 */;", int(';')}, + {"/* some comments */ SELECT ", selectKwd}, + {`-- comment continues to the end of line +SELECT`, selectKwd}, + {`# comment continues to the end of line +SELECT`, selectKwd}, + {"#comment\n123", intLit}, + {"--5", int('-')}, + {"--\nSELECT", selectKwd}, + {"--\tSELECT", 0}, + {"--\r\nSELECT", selectKwd}, + {"--", 0}, + } + runTest(c, table) +} + +func (s *testLexerSuite) TestscanQuotedIdent(c *C) { + l := NewScanner("`fk`") + l.r.peek() + tok, pos, lit := scanQuotedIdent(l) + c.Assert(pos.Offset, Equals, 0) + c.Assert(tok, Equals, quotedIdentifier) + c.Assert(lit, Equals, "fk") +} + +func (s *testLexerSuite) TestscanString(c *C) { + table := []struct { + raw string + expect string + }{ + {`' \n\tTest String'`, " \n\tTest String"}, + {`'\x\B'`, "xB"}, + {`'\0\'\"\b\n\r\t\\'`, "\000'\"\b\n\r\t\\"}, + {`'\Z'`, string(26)}, + {`'\%\_'`, `\%\_`}, + {`'hello'`, "hello"}, + {`'"hello"'`, `"hello"`}, + {`'""hello""'`, `""hello""`}, + {`'hel''lo'`, "hel'lo"}, + {`'\'hello'`, "'hello"}, + {`"hello"`, "hello"}, + {`"'hello'"`, "'hello'"}, + {`"''hello''"`, "''hello''"}, + {`"hel""lo"`, `hel"lo`}, + {`"\"hello"`, `"hello`}, + {`'disappearing\ backslash'`, "disappearing backslash"}, + {"'한국의中文UTF8およびテキストトラック'", "한국의中文UTF8およびテキストトラック"}, + {"'\\a\x90'", "a\x90"}, + {`"\aèàø»"`, `aèàø»`}, + } + + for _, v := range table { + l := NewScanner(v.raw) + tok, pos, lit := l.scan() + c.Assert(tok, Equals, stringLit) + c.Assert(pos.Offset, Equals, 0) + c.Assert(lit, Equals, v.expect) + } +} + +func (s *testLexerSuite) TestIdentifier(c *C) { + replacementString := string(unicode.ReplacementChar) + "xxx" + table := [][2]string{ + {`哈哈`, "哈哈"}, + {"`numeric`", "numeric"}, + {"\r\n \r \n \tthere\t \n", "there"}, + {`5number`, `5number`}, + {"1_x", "1_x"}, + {"0_x", "0_x"}, + {replacementString, replacementString}, + {fmt.Sprintf("t1%cxxx", 0), "t1"}, + } + l := &Scanner{} + for _, item := range table { + l.reset(item[0]) + var v yySymType + tok := l.Lex(&v) + c.Assert(tok, Equals, identifier) + c.Assert(v.ident, Equals, item[1]) + } +} + +func (s *testLexerSuite) TestSpecialComment(c *C) { + l := NewScanner("/*!40101 select\n5*/") + tok, pos, lit := l.scan() + c.Assert(tok, Equals, identifier) + c.Assert(lit, Equals, "select") + c.Assert(pos, Equals, Pos{0, 0, 9}) + + tok, pos, lit = l.scan() + c.Assert(tok, Equals, intLit) + c.Assert(lit, Equals, "5") + c.Assert(pos, Equals, Pos{1, 1, 16}) +} + +func (s *testLexerSuite) TestOptimizerHint(c *C) { + l := NewScanner(" /*+ BKA(t1) */") + tokens := []struct { + tok int + lit string + pos int + }{ + {hintBegin, "", 2}, + {identifier, "BKA", 6}, + {int('('), "(", 9}, + {identifier, "t1", 10}, + {int(')'), ")", 12}, + {hintEnd, "", 14}, + } + for i := 0; ; i++ { + tok, pos, lit := l.scan() + if tok == 0 { + return + } + c.Assert(tok, Equals, tokens[i].tok, Commentf("%d", i)) + c.Assert(lit, Equals, tokens[i].lit, Commentf("%d", i)) + c.Assert(pos.Offset, Equals, tokens[i].pos, Commentf("%d", i)) + } +} + +func (s *testLexerSuite) TestInt(c *C) { + tests := []struct { + input string + expect uint64 + }{ + {"01000001783", 1000001783}, + {"00001783", 1783}, + {"0", 0}, + {"0000", 0}, + {"01", 1}, + {"10", 10}, + } + scanner := NewScanner("") + for _, t := range tests { + var v yySymType + scanner.reset(t.input) + tok := scanner.Lex(&v) + c.Assert(tok, Equals, intLit) + switch i := v.item.(type) { + case int64: + c.Assert(uint64(i), Equals, t.expect) + case uint64: + c.Assert(i, Equals, t.expect) + default: + c.Fail() + } + } +} + +func (s *testLexerSuite) TestSQLModeANSIQuotes(c *C) { + tests := []struct { + input string + tok int + ident string + }{ + {`"identifier"`, identifier, "identifier"}, + {"`identifier`", identifier, "identifier"}, + {`"identifier""and"`, identifier, `identifier"and`}, + {`'string''string'`, stringLit, "string'string"}, + {`"identifier"'and'`, identifier, "identifier"}, + {`'string'"identifier"`, stringLit, "string"}, + } + scanner := NewScanner("") + scanner.SetSQLMode(mysql.ModeANSIQuotes) + for _, t := range tests { + var v yySymType + scanner.reset(t.input) + tok := scanner.Lex(&v) + c.Assert(tok, Equals, t.tok) + c.Assert(v.ident, Equals, t.ident) + } + scanner.reset(`'string' 'string'`) + var v yySymType + tok := scanner.Lex(&v) + c.Assert(tok, Equals, stringLit) + c.Assert(v.ident, Equals, "string") + tok = scanner.Lex(&v) + c.Assert(tok, Equals, stringLit) + c.Assert(v.ident, Equals, "string") +} + +func (s *testLexerSuite) TestIllegal(c *C) { + table := []testCaseItem{ + {"'", 0}, + {"'fu", 0}, + {"'\\n", 0}, + {"'\\", 0}, + {fmt.Sprintf("%c", 0), invalid}, + } + runTest(c, table) +} diff --git a/misc.go b/misc.go new file mode 100644 index 000000000..fbf19262e --- /dev/null +++ b/misc.go @@ -0,0 +1,618 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "strings" + + "github.com/pingcap/parser/charset" +) + +func isLetter(ch rune) bool { + return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') +} + +func isDigit(ch rune) bool { + return ch >= '0' && ch <= '9' +} + +func isIdentChar(ch rune) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || isIdentExtend(ch) +} + +func isIdentExtend(ch rune) bool { + return ch >= 0x80 && ch <= '\uffff' +} + +func isUserVarChar(ch rune) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || ch == '.' || isIdentExtend(ch) +} + +type trieNode struct { + childs [256]*trieNode + token int + fn func(s *Scanner) (int, Pos, string) +} + +var ruleTable trieNode + +func initTokenByte(c byte, tok int) { + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].token = tok +} + +func initTokenString(str string, tok int) { + node := &ruleTable + for _, c := range str { + if node.childs[c] == nil { + node.childs[c] = &trieNode{} + } + node = node.childs[c] + } + node.token = tok +} + +func initTokenFunc(str string, fn func(s *Scanner) (int, Pos, string)) { + for i := 0; i < len(str); i++ { + c := str[i] + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].fn = fn + } + return +} + +func init() { + // invalid is a special token defined in parser.y, when parser meet + // this token, it will throw an error. + // set root trie node's token to invalid, so when input match nothing + // in the trie, invalid will be the default return token. + ruleTable.token = invalid + initTokenByte('*', int('*')) + initTokenByte('/', int('/')) + initTokenByte('+', int('+')) + initTokenByte('>', int('>')) + initTokenByte('<', int('<')) + initTokenByte('(', int('(')) + initTokenByte(')', int(')')) + initTokenByte(';', int(';')) + initTokenByte(',', int(',')) + initTokenByte('&', int('&')) + initTokenByte('%', int('%')) + initTokenByte(':', int(':')) + initTokenByte('|', int('|')) + initTokenByte('!', int('!')) + initTokenByte('^', int('^')) + initTokenByte('~', int('~')) + initTokenByte('\\', int('\\')) + initTokenByte('?', paramMarker) + initTokenByte('=', eq) + initTokenByte('{', int('{')) + initTokenByte('}', int('}')) + + initTokenString("||", pipes) + initTokenString("&&", andand) + initTokenString("&^", andnot) + initTokenString(":=", assignmentEq) + initTokenString("<=>", nulleq) + initTokenString(">=", ge) + initTokenString("<=", le) + initTokenString("!=", neq) + initTokenString("<>", neqSynonym) + initTokenString("<<", lsh) + initTokenString(">>", rsh) + initTokenString("\\N", null) + + initTokenFunc("@", startWithAt) + initTokenFunc("/", startWithSlash) + initTokenFunc("-", startWithDash) + initTokenFunc("#", startWithSharp) + initTokenFunc("Xx", startWithXx) + initTokenFunc("Nn", startWithNn) + initTokenFunc("Bb", startWithBb) + initTokenFunc(".", startWithDot) + initTokenFunc("_$ACDEFGHIJKLMOPQRSTUVWYZacdefghijklmopqrstuvwyz", scanIdentifier) + initTokenFunc("`", scanQuotedIdent) + initTokenFunc("0123456789", startWithNumber) + initTokenFunc("'\"", startString) +} + +var tokenMap = map[string]int{ + "ACTION": action, + "ADD": add, + "ADDDATE": addDate, + "ADMIN": admin, + "AFTER": after, + "ALL": all, + "ALGORITHM": algorithm, + "ALTER": alter, + "ALWAYS": always, + "ANALYZE": analyze, + "AND": and, + "ANY": any, + "AS": as, + "ASC": asc, + "ASCII": ascii, + "AUTO_INCREMENT": autoIncrement, + "AVG": avg, + "AVG_ROW_LENGTH": avgRowLength, + "BEGIN": begin, + "BETWEEN": between, + "BIGINT": bigIntType, + "BINARY": binaryType, + "BINLOG": binlog, + "BIT": bitType, + "BIT_AND": bitAnd, + "BIT_OR": bitOr, + "BIT_XOR": bitXor, + "BLOB": blobType, + "BOOL": boolType, + "BOOLEAN": booleanType, + "BOTH": both, + "BTREE": btree, + "BUCKETS": buckets, + "BY": by, + "BYTE": byteType, + "CANCEL": cancel, + "CASCADE": cascade, + "CASCADED": cascaded, + "CASE": caseKwd, + "CAST": cast, + "CHANGE": change, + "CHAR": charType, + "CHARACTER": character, + "CHARSET": charsetKwd, + "CHECK": check, + "CHECKSUM": checksum, + "CLEANUP": cleanup, + "CLIENT": client, + "COALESCE": coalesce, + "COLLATE": collate, + "COLLATION": collation, + "COLUMN": column, + "COLUMNS": columns, + "COMMENT": comment, + "COMMIT": commit, + "COMMITTED": committed, + "COMPACT": compact, + "COMPRESSED": compressed, + "COMPRESSION": compression, + "CONNECTION": connection, + "CONSISTENT": consistent, + "CONSTRAINT": constraint, + "CONVERT": convert, + "COPY": copyKwd, + "COUNT": count, + "CREATE": create, + "CROSS": cross, + "CURRENT_DATE": currentDate, + "CURRENT_TIME": currentTime, + "CURRENT_TIMESTAMP": currentTs, + "CURRENT_USER": currentUser, + "CURTIME": curTime, + "DATA": data, + "DATABASE": database, + "DATABASES": databases, + "DATE": dateType, + "DATE_ADD": dateAdd, + "DATE_SUB": dateSub, + "DATETIME": datetimeType, + "DAY": day, + "DAY_HOUR": dayHour, + "DAY_MICROSECOND": dayMicrosecond, + "DAY_MINUTE": dayMinute, + "DAY_SECOND": daySecond, + "DDL": ddl, + "DEALLOCATE": deallocate, + "DEC": decimalType, + "DECIMAL": decimalType, + "DEFAULT": defaultKwd, + "DEFINER": definer, + "DELAY_KEY_WRITE": delayKeyWrite, + "DELAYED": delayed, + "DELETE": deleteKwd, + "DESC": desc, + "DESCRIBE": describe, + "DISABLE": disable, + "DISTINCT": distinct, + "DISTINCTROW": distinct, + "DIV": div, + "DO": do, + "DOUBLE": doubleType, + "DROP": drop, + "DUAL": dual, + "DUPLICATE": duplicate, + "DYNAMIC": dynamic, + "ELSE": elseKwd, + "ENABLE": enable, + "ENCLOSED": enclosed, + "END": end, + "ENGINE": engine, + "ENGINES": engines, + "ENUM": enum, + "ESCAPE": escape, + "ESCAPED": escaped, + "EVENT": event, + "EVENTS": events, + "EXCLUSIVE": exclusive, + "EXECUTE": execute, + "EXISTS": exists, + "EXPLAIN": explain, + "EXTRACT": extract, + "FALSE": falseKwd, + "FIELDS": fields, + "FIRST": first, + "FIXED": fixed, + "FLOAT": floatType, + "FLUSH": flush, + "FOR": forKwd, + "FORCE": force, + "FOREIGN": foreign, + "FORMAT": format, + "FROM": from, + "FULL": full, + "FULLTEXT": fulltext, + "FUNCTION": function, + "GENERATED": generated, + "GET_FORMAT": getFormat, + "GLOBAL": global, + "GRANT": grant, + "GRANTS": grants, + "GROUP": group, + "GROUP_CONCAT": groupConcat, + "HASH": hash, + "HAVING": having, + "HIGH_PRIORITY": highPriority, + "HOUR": hour, + "HOUR_MICROSECOND": hourMicrosecond, + "HOUR_MINUTE": hourMinute, + "HOUR_SECOND": hourSecond, + "IDENTIFIED": identified, + "IF": ifKwd, + "IGNORE": ignore, + "IN": in, + "INDEX": index, + "INDEXES": indexes, + "INFILE": infile, + "INNER": inner, + "INPLACE": inplace, + "INSERT": insert, + "INT": intType, + "INT1": int1Type, + "INT2": int2Type, + "INT3": int3Type, + "INT4": int4Type, + "INT8": int8Type, + "INTEGER": integerType, + "INTERVAL": interval, + "INTERNAL": internal, + "INTO": into, + "INVOKER": invoker, + "IS": is, + "ISOLATION": isolation, + "JOBS": jobs, + "JOB": job, + "JOIN": join, + "JSON": jsonType, + "KEY": key, + "KEY_BLOCK_SIZE": keyBlockSize, + "KEYS": keys, + "KILL": kill, + "LEADING": leading, + "LEFT": left, + "LESS": less, + "LEVEL": level, + "LIKE": like, + "LIMIT": limit, + "LINES": lines, + "LOAD": load, + "LOCAL": local, + "LOCALTIME": localTime, + "LOCALTIMESTAMP": localTs, + "LOCK": lock, + "LONG": long, + "LONGBLOB": longblobType, + "LONGTEXT": longtextType, + "LOW_PRIORITY": lowPriority, + "MASTER": master, + "MAX": max, + "MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour, + "MAX_EXECUTION_TIME": maxExecutionTime, + "MAX_QUERIES_PER_HOUR": maxQueriesPerHour, + "MAX_ROWS": maxRows, + "MAX_UPDATES_PER_HOUR": maxUpdatesPerHour, + "MAX_USER_CONNECTIONS": maxUserConnections, + "MAXVALUE": maxValue, + "MEDIUMBLOB": mediumblobType, + "MEDIUMINT": mediumIntType, + "MEDIUMTEXT": mediumtextType, + "MERGE": merge, + "MICROSECOND": microsecond, + "MIN": min, + "MIN_ROWS": minRows, + "MINUTE": minute, + "MINUTE_MICROSECOND": minuteMicrosecond, + "MINUTE_SECOND": minuteSecond, + "MOD": mod, + "MODE": mode, + "MODIFY": modify, + "MONTH": month, + "NAMES": names, + "NATIONAL": national, + "NATURAL": natural, + "NO": no, + "NO_WRITE_TO_BINLOG": noWriteToBinLog, + "NONE": none, + "NOT": not, + "NOW": now, + "NULL": null, + "NUMERIC": numericType, + "NVARCHAR": nvarcharType, + "OFFSET": offset, + "ON": on, + "ONLY": only, + "OPTION": option, + "OR": or, + "ORDER": order, + "OUTER": outer, + "PACK_KEYS": packKeys, + "PARTITION": partition, + "PARTITIONS": partitions, + "PASSWORD": password, + "PLUGINS": plugins, + "POSITION": position, + "PRECISION": precisionType, + "PREPARE": prepare, + "PRIMARY": primary, + "PRIVILEGES": privileges, + "PROCEDURE": procedure, + "PROCESS": process, + "PROCESSLIST": processlist, + "PROFILES": profiles, + "QUARTER": quarter, + "QUERY": query, + "QUERIES": queries, + "QUICK": quick, + "SHARD_ROW_ID_BITS": shardRowIDBits, + "RANGE": rangeKwd, + "RECOVER": recover, + "READ": read, + "REAL": realType, + "RECENT": recent, + "REDUNDANT": redundant, + "REFERENCES": references, + "REGEXP": regexpKwd, + "RELOAD": reload, + "RENAME": rename, + "REPEAT": repeat, + "REPEATABLE": repeatable, + "REPLACE": replace, + "REPLICATION": replication, + "RESTRICT": restrict, + "REVERSE": reverse, + "REVOKE": revoke, + "RIGHT": right, + "RLIKE": rlike, + "ROLLBACK": rollback, + "ROUTINE": routine, + "ROW": row, + "ROW_COUNT": rowCount, + "ROW_FORMAT": rowFormat, + "SCHEMA": database, + "SCHEMAS": databases, + "SECOND": second, + "SECOND_MICROSECOND": secondMicrosecond, + "SECURITY": security, + "SELECT": selectKwd, + "SERIALIZABLE": serializable, + "SESSION": session, + "SET": set, + "SEPARATOR": separator, + "SHARE": share, + "SHARED": shared, + "SHOW": show, + "SIGNED": signed, + "SLAVE": slave, + "SLOW": slow, + "SMALLINT": smallIntType, + "SNAPSHOT": snapshot, + "SOME": some, + "SQL": sql, + "SQL_CACHE": sqlCache, + "SQL_CALC_FOUND_ROWS": sqlCalcFoundRows, + "SQL_NO_CACHE": sqlNoCache, + "START": start, + "STARTING": starting, + "STATS": stats, + "STATS_BUCKETS": statsBuckets, + "STATS_HISTOGRAMS": statsHistograms, + "STATS_HEALTHY": statsHealthy, + "STATS_META": statsMeta, + "STATS_PERSISTENT": statsPersistent, + "STATUS": status, + "STORED": stored, + "STRAIGHT_JOIN": straightJoin, + "SUBDATE": subDate, + "SUBPARTITION": subpartition, + "SUBPARTITIONS": subpartitions, + "SUBSTR": substring, + "SUBSTRING": substring, + "SUM": sum, + "SUPER": super, + "TABLE": tableKwd, + "TABLES": tables, + "TABLESPACE": tablespace, + "TEMPORARY": temporary, + "TEMPTABLE": temptable, + "TERMINATED": terminated, + "TEXT": textType, + "THAN": than, + "THEN": then, + "TIDB": tidb, + "TIDB_HJ": tidbHJ, + "TIDB_INLJ": tidbINLJ, + "TIDB_SMJ": tidbSMJ, + "TIME": timeType, + "TIMESTAMP": timestampType, + "TIMESTAMPADD": timestampAdd, + "TIMESTAMPDIFF": timestampDiff, + "TINYBLOB": tinyblobType, + "TINYINT": tinyIntType, + "TINYTEXT": tinytextType, + "TO": to, + "TOP": top, + "TRACE": trace, + "TRAILING": trailing, + "TRANSACTION": transaction, + "TRIGGER": trigger, + "TRIGGERS": triggers, + "TRIM": trim, + "TRUE": trueKwd, + "TRUNCATE": truncate, + "UNCOMMITTED": uncommitted, + "UNDEFINED": undefined, + "UNION": union, + "UNIQUE": unique, + "UNKNOWN": unknown, + "UNLOCK": unlock, + "UNSIGNED": unsigned, + "UPDATE": update, + "USAGE": usage, + "USE": use, + "USER": user, + "USING": using, + "UTC_DATE": utcDate, + "UTC_TIME": utcTime, + "UTC_TIMESTAMP": utcTimestamp, + "VALUE": value, + "VALUES": values, + "VARBINARY": varbinaryType, + "VARCHAR": varcharType, + "VARIABLES": variables, + "VIEW": view, + "VIRTUAL": virtual, + "WARNINGS": warnings, + "ERRORS": identSQLErrors, + "WEEK": week, + "WHEN": when, + "WHERE": where, + "WITH": with, + "WRITE": write, + "XOR": xor, + "YEAR": yearType, + "YEAR_MONTH": yearMonth, + "ZEROFILL": zerofill, +} + +// See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details +var btFuncTokenMap = map[string]int{ + "ADDDATE": builtinAddDate, + "BIT_AND": builtinBitAnd, + "BIT_OR": builtinBitOr, + "BIT_XOR": builtinBitXor, + "CAST": builtinCast, + "COUNT": builtinCount, + "CURDATE": builtinCurDate, + "CURTIME": builtinCurTime, + "DATE_ADD": builtinDateAdd, + "DATE_SUB": builtinDateSub, + "EXTRACT": builtinExtract, + "GROUP_CONCAT": builtinGroupConcat, + "MAX": builtinMax, + "MID": builtinSubstring, + "MIN": builtinMin, + "NOW": builtinNow, + "POSITION": builtinPosition, + "SESSION_USER": builtinUser, + "STD": builtinStddevPop, + "STDDEV": builtinStddevPop, + "STDDEV_POP": builtinStddevPop, + "STDDEV_SAMP": builtinVarSamp, + "SUBDATE": builtinSubDate, + "SUBSTR": builtinSubstring, + "SUBSTRING": builtinSubstring, + "SUM": builtinSum, + "SYSDATE": builtinSysDate, + "SYSTEM_USER": builtinUser, + "TRIM": builtinTrim, + "VARIANCE": builtinVarPop, + "VAR_POP": builtinVarPop, + "VAR_SAMP": builtinVarSamp, +} + +// aliases are strings directly map to another string and use the same token. +var aliases = map[string]string{ + "SCHEMA": "DATABASE", + "SCHEMAS": "DATABASES", + "DEC": "DECIMAL", + "SUBSTR": "SUBSTRING", +} + +func (s *Scanner) isTokenIdentifier(lit string, offset int) int { + // An identifier before or after '.' means it is part of a qualified identifier. + // We do not parse it as keyword. + if s.r.peek() == '.' { + return 0 + } + if offset > 0 && s.r.s[offset-1] == '.' { + return 0 + } + buf := &s.buf + buf.Reset() + buf.Grow(len(lit)) + data := buf.Bytes()[:len(lit)] + for i := 0; i < len(lit); i++ { + if lit[i] >= 'a' && lit[i] <= 'z' { + data[i] = lit[i] + 'A' - 'a' + } else { + data[i] = lit[i] + } + } + + checkBtFuncToken, tokenStr := false, string(data) + if s.r.peek() == '(' { + checkBtFuncToken = true + } else if s.sqlMode.HasIgnoreSpaceMode() { + s.skipWhitespace() + if s.r.peek() == '(' { + checkBtFuncToken = true + } + } + if checkBtFuncToken { + if tok := btFuncTokenMap[tokenStr]; tok != 0 { + return tok + } + } + tok := tokenMap[tokenStr] + return tok +} + +func handleIdent(lval *yySymType) int { + s := lval.ident + // A character string literal may have an optional character set introducer and COLLATE clause: + // [_charset_name]'string' [COLLATE collation_name] + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + if !strings.HasPrefix(s, "_") { + return identifier + } + cs, _, err := charset.GetCharsetInfo(s[1:]) + if err != nil { + return identifier + } + lval.ident = cs + return underscoreCS +} diff --git a/model/ddl.go b/model/ddl.go new file mode 100644 index 000000000..fa7e9887e --- /dev/null +++ b/model/ddl.go @@ -0,0 +1,384 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" +) + +// ActionType is the type for DDL action. +type ActionType byte + +// List DDL actions. +const ( + ActionNone ActionType = 0 + ActionCreateSchema ActionType = 1 + ActionDropSchema ActionType = 2 + ActionCreateTable ActionType = 3 + ActionDropTable ActionType = 4 + ActionAddColumn ActionType = 5 + ActionDropColumn ActionType = 6 + ActionAddIndex ActionType = 7 + ActionDropIndex ActionType = 8 + ActionAddForeignKey ActionType = 9 + ActionDropForeignKey ActionType = 10 + ActionTruncateTable ActionType = 11 + ActionModifyColumn ActionType = 12 + ActionRebaseAutoID ActionType = 13 + ActionRenameTable ActionType = 14 + ActionSetDefaultValue ActionType = 15 + ActionShardRowID ActionType = 16 + ActionModifyTableComment ActionType = 17 + ActionRenameIndex ActionType = 18 + ActionAddTablePartition ActionType = 19 + ActionDropTablePartition ActionType = 20 +) + +// AddIndexStr is a string related to the operation of "add index". +const AddIndexStr = "add index" + +var actionMap = map[ActionType]string{ + ActionCreateSchema: "create schema", + ActionDropSchema: "drop schema", + ActionCreateTable: "create table", + ActionDropTable: "drop table", + ActionAddColumn: "add column", + ActionDropColumn: "drop column", + ActionAddIndex: AddIndexStr, + ActionDropIndex: "drop index", + ActionAddForeignKey: "add foreign key", + ActionDropForeignKey: "drop foreign key", + ActionTruncateTable: "truncate table", + ActionModifyColumn: "modify column", + ActionRebaseAutoID: "rebase auto_increment ID", + ActionRenameTable: "rename table", + ActionSetDefaultValue: "set default value", + ActionShardRowID: "shard row ID", + ActionModifyTableComment: "modify table comment", + ActionRenameIndex: "rename index", + ActionAddTablePartition: "add partition", + ActionDropTablePartition: "drop table partition", +} + +// String return current ddl action in string +func (action ActionType) String() string { + if v, ok := actionMap[action]; ok { + return v + } + return "none" +} + +// HistoryInfo is used for binlog. +type HistoryInfo struct { + SchemaVersion int64 + DBInfo *DBInfo + TableInfo *TableInfo + FinishedTS uint64 +} + +// AddDBInfo adds schema version and schema information that are used for binlog. +// dbInfo is added in the following operations: create database, drop database. +func (h *HistoryInfo) AddDBInfo(schemaVer int64, dbInfo *DBInfo) { + h.SchemaVersion = schemaVer + h.DBInfo = dbInfo +} + +// AddTableInfo adds schema version and table information that are used for binlog. +// tblInfo is added except for the following operations: create database, drop database. +func (h *HistoryInfo) AddTableInfo(schemaVer int64, tblInfo *TableInfo) { + h.SchemaVersion = schemaVer + h.TableInfo = tblInfo +} + +// Clean cleans history information. +func (h *HistoryInfo) Clean() { + h.SchemaVersion = 0 + h.DBInfo = nil + h.TableInfo = nil +} + +// DDLReorgMeta is meta info of DDL reorganization. +type DDLReorgMeta struct { + // EndHandle is the last handle of the adding indices table. + // We should only backfill indices in the range [startHandle, EndHandle]. + EndHandle int64 `json:"end_handle"` +} + +// NewDDLReorgMeta new a DDLReorgMeta. +func NewDDLReorgMeta() *DDLReorgMeta { + return &DDLReorgMeta{ + EndHandle: math.MaxInt64, + } +} + +// Job is for a DDL operation. +type Job struct { + ID int64 `json:"id"` + Type ActionType `json:"type"` + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + State JobState `json:"state"` + Error *terror.Error `json:"err"` + // ErrorCount will be increased, every time we meet an error when running job. + ErrorCount int64 `json:"err_count"` + // RowCount means the number of rows that are processed. + RowCount int64 `json:"row_count"` + Mu sync.Mutex `json:"-"` + Args []interface{} `json:"-"` + // RawArgs : We must use json raw message to delay parsing special args. + RawArgs json.RawMessage `json:"raw_args"` + SchemaState SchemaState `json:"schema_state"` + // SnapshotVer means snapshot version for this job. + SnapshotVer uint64 `json:"snapshot_ver"` + // StartTS uses timestamp allocated by TSO. + // Now it's the TS when we put the job to TiKV queue. + StartTS uint64 `json:"start_ts"` + // DependencyID is the job's ID that the current job depends on. + DependencyID int64 `json:"dependency_id"` + // Query string of the ddl job. + Query string `json:"query"` + BinlogInfo *HistoryInfo `json:"binlog"` + + // Version indicates the DDL job version. For old jobs, it will be 0. + Version int64 `json:"version"` + + // ReorgMeta is meta info of ddl reorganization. + // This field is depreciated. + ReorgMeta *DDLReorgMeta `json:"reorg_meta"` + + // Priority is only used to set the operation priority of adding indices. + Priority int `json:"priority"` +} + +// FinishTableJob is called when a job is finished. +// It updates the job's state information and adds tblInfo to the binlog. +func (job *Job) FinishTableJob(jobState JobState, schemaState SchemaState, ver int64, tblInfo *TableInfo) { + job.State = jobState + job.SchemaState = schemaState + job.BinlogInfo.AddTableInfo(ver, tblInfo) +} + +// FinishDBJob is called when a job is finished. +// It updates the job's state information and adds dbInfo the binlog. +func (job *Job) FinishDBJob(jobState JobState, schemaState SchemaState, ver int64, dbInfo *DBInfo) { + job.State = jobState + job.SchemaState = schemaState + job.BinlogInfo.AddDBInfo(ver, dbInfo) +} + +// TSConvert2Time converts timestamp to time. +func TSConvert2Time(ts uint64) time.Time { + t := int64(ts >> 18) // 18 is for the logical time. + return time.Unix(t/1e3, (t%1e3)*1e6) +} + +// SetRowCount sets the number of rows. Make sure it can pass `make race`. +func (job *Job) SetRowCount(count int64) { + job.Mu.Lock() + defer job.Mu.Unlock() + + job.RowCount = count +} + +// GetRowCount gets the number of rows. Make sure it can pass `make race`. +func (job *Job) GetRowCount() int64 { + job.Mu.Lock() + defer job.Mu.Unlock() + + return job.RowCount +} + +// Encode encodes job with json format. +// updateRawArgs is used to determine whether to update the raw args. +func (job *Job) Encode(updateRawArgs bool) ([]byte, error) { + var err error + if updateRawArgs { + job.RawArgs, err = json.Marshal(job.Args) + if err != nil { + return nil, errors.Trace(err) + } + } + + var b []byte + job.Mu.Lock() + defer job.Mu.Unlock() + b, err = json.Marshal(job) + + return b, errors.Trace(err) +} + +// Decode decodes job from the json buffer, we must use DecodeArgs later to +// decode special args for this job. +func (job *Job) Decode(b []byte) error { + err := json.Unmarshal(b, job) + return errors.Trace(err) +} + +// DecodeArgs decodes job args. +func (job *Job) DecodeArgs(args ...interface{}) error { + job.Args = args + err := json.Unmarshal(job.RawArgs, &job.Args) + return errors.Trace(err) +} + +// String implements fmt.Stringer interface. +func (job *Job) String() string { + rowCount := job.GetRowCount() + return fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, RowCount:%d, ArgLen:%d, start time: %v, Err:%v, ErrCount:%d, SnapshotVersion:%v", + job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, rowCount, len(job.Args), TSConvert2Time(job.StartTS), job.Error, job.ErrorCount, job.SnapshotVer) +} + +func (job *Job) hasDependentSchema(other *Job) (bool, error) { + if other.Type == ActionDropSchema || other.Type == ActionCreateSchema { + if other.SchemaID == job.SchemaID { + return true, nil + } + if job.Type == ActionRenameTable { + var oldSchemaID int64 + if err := job.DecodeArgs(&oldSchemaID); err != nil { + return false, errors.Trace(err) + } + if other.SchemaID == oldSchemaID { + return true, nil + } + } + } + return false, nil +} + +// IsDependentOn returns whether the job depends on "other". +// How to check the job depends on "other"? +// 1. The two jobs handle the same database when one of the two jobs is an ActionDropSchema or ActionCreateSchema type. +// 2. Or the two jobs handle the same table. +func (job *Job) IsDependentOn(other *Job) (bool, error) { + isDependent, err := job.hasDependentSchema(other) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + isDependent, err = other.hasDependentSchema(job) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + + // TODO: If a job is ActionRenameTable, we need to check table name. + if other.TableID == job.TableID { + return true, nil + } + return false, nil +} + +// IsFinished returns whether job is finished or not. +// If the job state is Done or Cancelled, it is finished. +func (job *Job) IsFinished() bool { + return job.State == JobStateDone || job.State == JobStateRollbackDone || job.State == JobStateCancelled +} + +// IsCancelled returns whether the job is cancelled or not. +func (job *Job) IsCancelled() bool { + return job.State == JobStateCancelled +} + +// IsRollbackDone returns whether the job is rolled back or not. +func (job *Job) IsRollbackDone() bool { + return job.State == JobStateRollbackDone +} + +// IsRollingback returns whether the job is rolling back or not. +func (job *Job) IsRollingback() bool { + return job.State == JobStateRollingback +} + +// IsCancelling returns whether the job is cancelling or not. +func (job *Job) IsCancelling() bool { + return job.State == JobStateCancelling +} + +// IsSynced returns whether the DDL modification is synced among all TiDB servers. +func (job *Job) IsSynced() bool { + return job.State == JobStateSynced +} + +// IsDone returns whether job is done. +func (job *Job) IsDone() bool { + return job.State == JobStateDone +} + +// IsRunning returns whether job is still running or not. +func (job *Job) IsRunning() bool { + return job.State == JobStateRunning +} + +// JobState is for job state. +type JobState byte + +// List job states. +const ( + JobStateNone JobState = 0 + JobStateRunning JobState = 1 + // When DDL encountered an unrecoverable error at reorganization state, + // some keys has been added already, we need to remove them. + // JobStateRollingback is the state to do the rolling back job. + JobStateRollingback JobState = 2 + JobStateRollbackDone JobState = 3 + JobStateDone JobState = 4 + JobStateCancelled JobState = 5 + // JobStateSynced is used to mark the information about the completion of this job + // has been synchronized to all servers. + JobStateSynced JobState = 6 + // JobStateCancelling is used to mark the DDL job is cancelled by the client, but the DDL work hasn't handle it. + JobStateCancelling JobState = 7 +) + +// String implements fmt.Stringer interface. +func (s JobState) String() string { + switch s { + case JobStateRunning: + return "running" + case JobStateRollingback: + return "rollingback" + case JobStateRollbackDone: + return "rollback done" + case JobStateDone: + return "done" + case JobStateCancelled: + return "cancelled" + case JobStateCancelling: + return "cancelling" + case JobStateSynced: + return "synced" + default: + return "none" + } +} + +// SchemaDiff contains the schema modification at a particular schema version. +// It is used to reduce schema reload cost. +type SchemaDiff struct { + Version int64 `json:"version"` + Type ActionType `json:"type"` + SchemaID int64 `json:"schema_id"` + TableID int64 `json:"table_id"` + + // OldTableID is the table ID before truncate, only used by truncate table DDL. + OldTableID int64 `json:"old_table_id"` + // OldSchemaID is the schema ID before rename table, only used by rename table DDL. + OldSchemaID int64 `json:"old_schema_id"` +} diff --git a/model/flags.go b/model/flags.go new file mode 100644 index 000000000..33b040edf --- /dev/null +++ b/model/flags.go @@ -0,0 +1,43 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Flags are used by tipb.SelectRequest.Flags to handle execution mode, like how to handle truncate error. +const ( + // FlagIgnoreTruncate indicates if truncate error should be ignored. + // Read-only statements should ignore truncate error, write statements should not ignore truncate error. + FlagIgnoreTruncate uint64 = 1 + // FlagTruncateAsWarning indicates if truncate error should be returned as warning. + // This flag only matters if FlagIgnoreTruncate is not set, in strict sql mode, truncate error should + // be returned as error, in non-strict sql mode, truncate error should be saved as warning. + FlagTruncateAsWarning = 1 << 1 + // FlagPadCharToFullLength indicates if sql_mode 'PAD_CHAR_TO_FULL_LENGTH' is set. + FlagPadCharToFullLength = 1 << 2 + // FlagInInsertStmt indicates if this is a INSERT statement. + FlagInInsertStmt = 1 << 3 + // FlagInUpdateOrDeleteStmt indicates if this is a UPDATE statement or a DELETE statement. + FlagInUpdateOrDeleteStmt = 1 << 4 + // FlagInSelectStmt indicates if this is a SELECT statement. + FlagInSelectStmt = 1 << 5 + // FlagOverflowAsWarning indicates if overflow error should be returned as warning. + // In strict sql mode, overflow error should be returned as error, + // in non-strict sql mode, overflow error should be saved as warning. + FlagOverflowAsWarning = 1 << 6 + // FlagIgnoreZeroInDate indicates if ZeroInDate error should be ignored. + // Read-only statements should ignore ZeroInDate error. + // Write statements should not ignore ZeroInDate error in strict sql mode. + FlagIgnoreZeroInDate = 1 << 7 + // FlagDividedByZeroAsWarning indicates if DividedByZero should be returned as warning. + FlagDividedByZeroAsWarning = 1 << 8 +) diff --git a/model/model.go b/model/model.go new file mode 100644 index 000000000..76a5e357d --- /dev/null +++ b/model/model.go @@ -0,0 +1,572 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/types" + "github.com/pingcap/tipb/go-tipb" +) + +// SchemaState is the state for schema elements. +type SchemaState byte + +const ( + // StateNone means this schema element is absent and can't be used. + StateNone SchemaState = iota + // StateDeleteOnly means we can only delete items for this schema element. + StateDeleteOnly + // StateWriteOnly means we can use any write operation on this schema element, + // but outer can't read the changed data. + StateWriteOnly + // StateWriteReorganization means we are re-organizing whole data after write only state. + StateWriteReorganization + // StateDeleteReorganization means we are re-organizing whole data after delete only state. + StateDeleteReorganization + // StatePublic means this schema element is ok for all write and read operations. + StatePublic +) + +// String implements fmt.Stringer interface. +func (s SchemaState) String() string { + switch s { + case StateDeleteOnly: + return "delete only" + case StateWriteOnly: + return "write only" + case StateWriteReorganization: + return "write reorganization" + case StateDeleteReorganization: + return "delete reorganization" + case StatePublic: + return "public" + default: + return "none" + } +} + +// ColumnInfo provides meta data describing of a table column. +type ColumnInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + Offset int `json:"offset"` + OriginDefaultValue interface{} `json:"origin_default"` + DefaultValue interface{} `json:"default"` + DefaultValueBit []byte `json:"default_bit"` + GeneratedExprString string `json:"generated_expr_string"` + GeneratedStored bool `json:"generated_stored"` + Dependences map[string]struct{} `json:"dependences"` + types.FieldType `json:"type"` + State SchemaState `json:"state"` + Comment string `json:"comment"` +} + +// Clone clones ColumnInfo. +func (c *ColumnInfo) Clone() *ColumnInfo { + nc := *c + return &nc +} + +// IsGenerated returns true if the column is generated column. +func (c *ColumnInfo) IsGenerated() bool { + return len(c.GeneratedExprString) != 0 +} + +// SetDefaultValue sets the default value. +func (c *ColumnInfo) SetDefaultValue(value interface{}) error { + c.DefaultValue = value + if c.Tp == mysql.TypeBit { + // For mysql.TypeBit type, the default value storage format must be a string. + // Other value such as int must convert to string format first. + // The mysql.TypeBit type supports the null default value. + if value == nil { + return nil + } + if v, ok := value.(string); ok { + c.DefaultValueBit = []byte(v) + return nil + } + return types.ErrInvalidDefault.GenWithStackByArgs(c.Name) + } + return nil +} + +// GetDefaultValue gets the default value of the column. +// Default value use to stored in DefaultValue field, but now, +// bit type default value will store in DefaultValueBit for fix bit default value decode/encode bug. +func (c *ColumnInfo) GetDefaultValue() interface{} { + if c.Tp == mysql.TypeBit && c.DefaultValueBit != nil { + return string(c.DefaultValueBit) + } + return c.DefaultValue +} + +// FindColumnInfo finds ColumnInfo in cols by name. +func FindColumnInfo(cols []*ColumnInfo, name string) *ColumnInfo { + name = strings.ToLower(name) + for _, col := range cols { + if col.Name.L == name { + return col + } + } + + return nil +} + +// ExtraHandleID is the column ID of column which we need to append to schema to occupy the handle's position +// for use of execution phase. +const ExtraHandleID = -1 + +// ExtraHandleName is the name of ExtraHandle Column. +var ExtraHandleName = NewCIStr("_tidb_rowid") + +// TableInfo provides meta data describing a DB table. +type TableInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + Charset string `json:"charset"` + Collate string `json:"collate"` + // Columns are listed in the order in which they appear in the schema. + Columns []*ColumnInfo `json:"cols"` + Indices []*IndexInfo `json:"index_info"` + ForeignKeys []*FKInfo `json:"fk_info"` + State SchemaState `json:"state"` + PKIsHandle bool `json:"pk_is_handle"` + Comment string `json:"comment"` + AutoIncID int64 `json:"auto_inc_id"` + MaxColumnID int64 `json:"max_col_id"` + MaxIndexID int64 `json:"max_idx_id"` + // UpdateTS is used to record the timestamp of updating the table's schema information. + // These changing schema operations don't include 'truncate table' and 'rename table'. + UpdateTS uint64 `json:"update_timestamp"` + // OldSchemaID : + // Because auto increment ID has schemaID as prefix, + // We need to save original schemaID to keep autoID unchanged + // while renaming a table from one database to another. + // TODO: Remove it. + // Now it only uses for compatibility with the old version that already uses this field. + OldSchemaID int64 `json:"old_schema_id,omitempty"` + + // ShardRowIDBits specify if the implicit row ID is sharded. + ShardRowIDBits uint64 + + Partition *PartitionInfo `json:"partition"` + + Compression string `json:"compression"` +} + +// GetPartitionInfo returns the partition information. +func (t *TableInfo) GetPartitionInfo() *PartitionInfo { + if t.Partition != nil && t.Partition.Enable { + return t.Partition + } + return nil +} + +// GetUpdateTime gets the table's updating time. +func (t *TableInfo) GetUpdateTime() time.Time { + return TSConvert2Time(t.UpdateTS) +} + +// GetDBID returns the schema ID that is used to create an allocator. +// TODO: Remove it after removing OldSchemaID. +func (t *TableInfo) GetDBID(dbID int64) int64 { + if t.OldSchemaID != 0 { + return t.OldSchemaID + } + return dbID +} + +// Clone clones TableInfo. +func (t *TableInfo) Clone() *TableInfo { + nt := *t + nt.Columns = make([]*ColumnInfo, len(t.Columns)) + nt.Indices = make([]*IndexInfo, len(t.Indices)) + nt.ForeignKeys = make([]*FKInfo, len(t.ForeignKeys)) + + for i := range t.Columns { + nt.Columns[i] = t.Columns[i].Clone() + } + + for i := range t.Indices { + nt.Indices[i] = t.Indices[i].Clone() + } + + for i := range t.ForeignKeys { + nt.ForeignKeys[i] = t.ForeignKeys[i].Clone() + } + + return &nt +} + +// GetPkName will return the pk name if pk exists. +func (t *TableInfo) GetPkName() CIStr { + if t.PKIsHandle { + for _, colInfo := range t.Columns { + if mysql.HasPriKeyFlag(colInfo.Flag) { + return colInfo.Name + } + } + } + return CIStr{} +} + +// GetPkColInfo gets the ColumnInfo of pk if exists. +// Make sure PkIsHandle checked before call this method. +func (t *TableInfo) GetPkColInfo() *ColumnInfo { + for _, colInfo := range t.Columns { + if mysql.HasPriKeyFlag(colInfo.Flag) { + return colInfo + } + } + return nil +} + +// Cols returns the columns of the table in public state. +func (t *TableInfo) Cols() []*ColumnInfo { + publicColumns := make([]*ColumnInfo, len(t.Columns)) + maxOffset := -1 + for _, col := range t.Columns { + if col.State != StatePublic { + continue + } + publicColumns[col.Offset] = col + if maxOffset < col.Offset { + maxOffset = col.Offset + } + } + return publicColumns[0 : maxOffset+1] +} + +// NewExtraHandleColInfo mocks a column info for extra handle column. +func NewExtraHandleColInfo() *ColumnInfo { + colInfo := &ColumnInfo{ + ID: ExtraHandleID, + Name: ExtraHandleName, + } + colInfo.Flag = mysql.PriKeyFlag + colInfo.Tp = mysql.TypeLonglong + colInfo.Flen, colInfo.Decimal = mysql.GetDefaultFieldLengthAndDecimal(mysql.TypeLonglong) + return colInfo +} + +// ColumnIsInIndex checks whether c is included in any indices of t. +func (t *TableInfo) ColumnIsInIndex(c *ColumnInfo) bool { + for _, index := range t.Indices { + for _, column := range index.Columns { + if column.Name.L == c.Name.L { + return true + } + } + } + return false +} + +// PartitionType is the type for PartitionInfo +type PartitionType int + +// Partition types. +const ( + PartitionTypeRange PartitionType = 1 + PartitionTypeHash PartitionType = 2 + PartitionTypeList PartitionType = 3 +) + +func (p PartitionType) String() string { + switch p { + case PartitionTypeRange: + return "RANGE" + case PartitionTypeHash: + return "HASH" + case PartitionTypeList: + return "LIST" + default: + return "" + } + +} + +// PartitionInfo provides table partition info. +type PartitionInfo struct { + Type PartitionType `json:"type"` + Expr string `json:"expr"` + Columns []CIStr `json:"columns"` + + // User may already creates table with partition but table partition is not + // yet supported back then. When Enable is true, write/read need use tid + // rather than pid. + Enable bool `json:"enable"` + + Definitions []PartitionDefinition `json:"definitions"` +} + +// GetNameByID gets the partition name by ID. +func (pi *PartitionInfo) GetNameByID(id int64) string { + for _, def := range pi.Definitions { + if id == def.ID { + return def.Name.L + } + } + return "" +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + ID int64 `json:"id"` + Name CIStr `json:"name"` + LessThan []string `json:"less_than"` + Comment string `json:"comment,omitempty"` +} + +// IndexColumn provides index column info. +type IndexColumn struct { + Name CIStr `json:"name"` // Index name + Offset int `json:"offset"` // Index offset + // Length of prefix when using column prefix + // for indexing; + // UnspecifedLength if not using prefix indexing + Length int `json:"length"` +} + +// Clone clones IndexColumn. +func (i *IndexColumn) Clone() *IndexColumn { + ni := *i + return &ni +} + +// IndexType is the type of index +type IndexType int + +// String implements Stringer interface. +func (t IndexType) String() string { + switch t { + case IndexTypeBtree: + return "BTREE" + case IndexTypeHash: + return "HASH" + default: + return "" + } +} + +// IndexTypes +const ( + IndexTypeInvalid IndexType = iota + IndexTypeBtree + IndexTypeHash +) + +// IndexInfo provides meta data describing a DB index. +// It corresponds to the statement `CREATE INDEX Name ON Table (Column);` +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type IndexInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"idx_name"` // Index name. + Table CIStr `json:"tbl_name"` // Table name. + Columns []*IndexColumn `json:"idx_cols"` // Index columns. + Unique bool `json:"is_unique"` // Whether the index is unique. + Primary bool `json:"is_primary"` // Whether the index is primary key. + State SchemaState `json:"state"` + Comment string `json:"comment"` // Comment + Tp IndexType `json:"index_type"` // Index type: Btree or Hash +} + +// Clone clones IndexInfo. +func (index *IndexInfo) Clone() *IndexInfo { + ni := *index + ni.Columns = make([]*IndexColumn, len(index.Columns)) + for i := range index.Columns { + ni.Columns[i] = index.Columns[i].Clone() + } + return &ni +} + +// HasPrefixIndex returns whether any columns of this index uses prefix length. +func (index *IndexInfo) HasPrefixIndex() bool { + for _, ic := range index.Columns { + if ic.Length != types.UnspecifiedLength { + return true + } + } + return false +} + +// FKInfo provides meta data describing a foreign key constraint. +type FKInfo struct { + ID int64 `json:"id"` + Name CIStr `json:"fk_name"` + RefTable CIStr `json:"ref_table"` + RefCols []CIStr `json:"ref_cols"` + Cols []CIStr `json:"cols"` + OnDelete int `json:"on_delete"` + OnUpdate int `json:"on_update"` + State SchemaState `json:"state"` +} + +// Clone clones FKInfo. +func (fk *FKInfo) Clone() *FKInfo { + nfk := *fk + + nfk.RefCols = make([]CIStr, len(fk.RefCols)) + nfk.Cols = make([]CIStr, len(fk.Cols)) + copy(nfk.RefCols, fk.RefCols) + copy(nfk.Cols, fk.Cols) + + return &nfk +} + +// DBInfo provides meta data describing a DB. +type DBInfo struct { + ID int64 `json:"id"` // Database ID + Name CIStr `json:"db_name"` // DB name. + Charset string `json:"charset"` + Collate string `json:"collate"` + Tables []*TableInfo `json:"-"` // Tables in the DB. + State SchemaState `json:"state"` +} + +// Clone clones DBInfo. +func (db *DBInfo) Clone() *DBInfo { + newInfo := *db + newInfo.Tables = make([]*TableInfo, len(db.Tables)) + for i := range db.Tables { + newInfo.Tables[i] = db.Tables[i].Clone() + } + return &newInfo +} + +// Copy shallow copies DBInfo. +func (db *DBInfo) Copy() *DBInfo { + newInfo := *db + newInfo.Tables = make([]*TableInfo, len(db.Tables)) + copy(newInfo.Tables, db.Tables) + return &newInfo +} + +// CIStr is case insensitive string. +type CIStr struct { + O string `json:"O"` // Original string. + L string `json:"L"` // Lower case string. +} + +// String implements fmt.Stringer interface. +func (cis CIStr) String() string { + return cis.O +} + +// NewCIStr creates a new CIStr. +func NewCIStr(s string) (cs CIStr) { + cs.O = s + cs.L = strings.ToLower(s) + return +} + +// UnmarshalJSON implements the user defined unmarshal method. +// CIStr can be unmarshaled from a single string, so PartitionDefinition.Name +// in this change https://github.com/pingcap/tidb/pull/6460/files would be +// compatible during TiDB upgrading. +func (cis *CIStr) UnmarshalJSON(b []byte) error { + type T CIStr + if err := json.Unmarshal(b, (*T)(cis)); err == nil { + return nil + } + + // Unmarshal CIStr from a single string. + err := json.Unmarshal(b, &cis.O) + if err != nil { + return errors.Trace(err) + } + cis.L = strings.ToLower(cis.O) + return nil +} + +// ColumnsToProto converts a slice of model.ColumnInfo to a slice of tipb.ColumnInfo. +func ColumnsToProto(columns []*ColumnInfo, pkIsHandle bool) []*tipb.ColumnInfo { + cols := make([]*tipb.ColumnInfo, 0, len(columns)) + for _, c := range columns { + col := ColumnToProto(c) + // TODO: Here `PkHandle`'s meaning is changed, we will change it to `IsHandle` when tikv's old select logic + // is abandoned. + if (pkIsHandle && mysql.HasPriKeyFlag(c.Flag)) || c.ID == ExtraHandleID { + col.PkHandle = true + } else { + col.PkHandle = false + } + cols = append(cols, col) + } + return cols +} + +// IndexToProto converts a model.IndexInfo to a tipb.IndexInfo. +func IndexToProto(t *TableInfo, idx *IndexInfo) *tipb.IndexInfo { + pi := &tipb.IndexInfo{ + TableId: t.ID, + IndexId: idx.ID, + Unique: idx.Unique, + } + cols := make([]*tipb.ColumnInfo, 0, len(idx.Columns)+1) + for _, c := range idx.Columns { + cols = append(cols, ColumnToProto(t.Columns[c.Offset])) + } + if t.PKIsHandle { + // Coprocessor needs to know PKHandle column info, so we need to append it. + for _, col := range t.Columns { + if mysql.HasPriKeyFlag(col.Flag) { + colPB := ColumnToProto(col) + colPB.PkHandle = true + cols = append(cols, colPB) + break + } + } + } + pi.Columns = cols + return pi +} + +// ColumnToProto converts model.ColumnInfo to tipb.ColumnInfo. +func ColumnToProto(c *ColumnInfo) *tipb.ColumnInfo { + pc := &tipb.ColumnInfo{ + ColumnId: c.ID, + Collation: collationToProto(c.FieldType.Collate), + ColumnLen: int32(c.FieldType.Flen), + Decimal: int32(c.FieldType.Decimal), + Flag: int32(c.Flag), + Elems: c.Elems, + } + pc.Tp = int32(c.FieldType.Tp) + return pc +} + +// TODO: update it when more collate is supported. +func collationToProto(c string) int32 { + v := mysql.CollationNames[c] + if v == mysql.BinaryCollationID { + return int32(mysql.BinaryCollationID) + } + // We only support binary and utf8_bin collation. + // Setting other collations to utf8_bin for old data compatibility. + // For the data created when we didn't enforce utf8_bin collation in create table. + return int32(mysql.DefaultCollationID) +} + +// GetTableColumnID gets a ID of a column with table ID +func GetTableColumnID(tableInfo *TableInfo, col *ColumnInfo) string { + return fmt.Sprintf("%d_%d", tableInfo.ID, col.ID) +} diff --git a/model/model_test.go b/model/model_test.go new file mode 100644 index 000000000..9d5403f59 --- /dev/null +++ b/model/model_test.go @@ -0,0 +1,307 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/types" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testModelSuite{}) + +type testModelSuite struct { +} + +func (*testModelSuite) TestT(c *C) { + abc := NewCIStr("aBC") + c.Assert(abc.O, Equals, "aBC") + c.Assert(abc.L, Equals, "abc") + c.Assert(abc.String(), Equals, "aBC") +} + +func (*testModelSuite) TestModelBasic(c *C) { + column := &ColumnInfo{ + ID: 1, + Name: NewCIStr("c"), + Offset: 0, + DefaultValue: 0, + FieldType: *types.NewFieldType(0), + } + column.Flag |= mysql.PriKeyFlag + + index := &IndexInfo{ + Name: NewCIStr("key"), + Table: NewCIStr("t"), + Columns: []*IndexColumn{ + { + Name: NewCIStr("c"), + Offset: 0, + Length: 10, + }}, + Unique: true, + Primary: true, + } + + fk := &FKInfo{ + RefCols: []CIStr{NewCIStr("a")}, + Cols: []CIStr{NewCIStr("a")}, + } + + table := &TableInfo{ + ID: 1, + Name: NewCIStr("t"), + Charset: "utf8", + Collate: "utf8_bin", + Columns: []*ColumnInfo{column}, + Indices: []*IndexInfo{index}, + ForeignKeys: []*FKInfo{fk}, + PKIsHandle: true, + } + + dbInfo := &DBInfo{ + ID: 1, + Name: NewCIStr("test"), + Charset: "utf8", + Collate: "utf8_bin", + Tables: []*TableInfo{table}, + } + + n := dbInfo.Clone() + c.Assert(n, DeepEquals, dbInfo) + + pkName := table.GetPkName() + c.Assert(pkName, Equals, NewCIStr("c")) + newColumn := table.GetPkColInfo() + c.Assert(newColumn, DeepEquals, column) + inIdx := table.ColumnIsInIndex(column) + c.Assert(inIdx, Equals, true) + tp := IndexTypeBtree + c.Assert(tp.String(), Equals, "BTREE") + tp = IndexTypeHash + c.Assert(tp.String(), Equals, "HASH") + tp = 1E5 + c.Assert(tp.String(), Equals, "") + has := index.HasPrefixIndex() + c.Assert(has, Equals, true) + t := table.GetUpdateTime() + c.Assert(t, Equals, TSConvert2Time(table.UpdateTS)) + + // Corner cases + column.Flag ^= mysql.PriKeyFlag + pkName = table.GetPkName() + c.Assert(pkName, Equals, NewCIStr("")) + newColumn = table.GetPkColInfo() + c.Assert(newColumn, IsNil) + anCol := &ColumnInfo{ + Name: NewCIStr("d"), + } + exIdx := table.ColumnIsInIndex(anCol) + c.Assert(exIdx, Equals, false) + anIndex := &IndexInfo{ + Columns: []*IndexColumn{}, + } + no := anIndex.HasPrefixIndex() + c.Assert(no, Equals, false) +} + +func (*testModelSuite) TestJobStartTime(c *C) { + job := &Job{ + ID: 123, + BinlogInfo: &HistoryInfo{}, + } + t := time.Unix(0, 0) + c.Assert(t, Equals, TSConvert2Time(job.StartTS)) + ret := fmt.Sprintf("%s", job) + c.Assert(job.String(), Equals, ret) +} + +func (*testModelSuite) TestJobCodec(c *C) { + type A struct { + Name string + } + job := &Job{ + ID: 1, + TableID: 2, + SchemaID: 1, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{NewCIStr("a"), A{Name: "abc"}}, + } + job.BinlogInfo.AddDBInfo(123, &DBInfo{ID: 1, Name: NewCIStr("test_history_db")}) + job.BinlogInfo.AddTableInfo(123, &TableInfo{ID: 1, Name: NewCIStr("test_history_tbl")}) + + // Test IsDependentOn. + // job: table ID is 2 + // job1: table ID is 2 + var err error + job1 := &Job{ + ID: 2, + TableID: 2, + SchemaID: 1, + Type: ActionRenameTable, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{int64(3), NewCIStr("new_table_name")}, + } + job1.RawArgs, err = json.Marshal(job1.Args) + c.Assert(err, IsNil) + isDependent, err := job.IsDependentOn(job1) + c.Assert(err, IsNil) + c.Assert(isDependent, IsTrue) + // job1: rename table, old schema ID is 3 + // job2: create schema, schema ID is 3 + job2 := &Job{ + ID: 3, + TableID: 3, + SchemaID: 3, + Type: ActionCreateSchema, + BinlogInfo: &HistoryInfo{}, + } + isDependent, err = job2.IsDependentOn(job1) + c.Assert(err, IsNil) + c.Assert(isDependent, IsTrue) + + c.Assert(job.IsCancelled(), Equals, false) + b, err := job.Encode(false) + c.Assert(err, IsNil) + newJob := &Job{} + err = newJob.Decode(b) + c.Assert(err, IsNil) + c.Assert(newJob.BinlogInfo, DeepEquals, job.BinlogInfo) + name := CIStr{} + a := A{} + err = newJob.DecodeArgs(&name, &a) + c.Assert(err, IsNil) + c.Assert(name, DeepEquals, NewCIStr("")) + c.Assert(a, DeepEquals, A{Name: ""}) + c.Assert(len(newJob.String()), Greater, 0) + + job.BinlogInfo.Clean() + b1, err := job.Encode(true) + c.Assert(err, IsNil) + newJob = &Job{} + err = newJob.Decode(b1) + c.Assert(err, IsNil) + c.Assert(newJob.BinlogInfo, DeepEquals, &HistoryInfo{}) + name = CIStr{} + a = A{} + err = newJob.DecodeArgs(&name, &a) + c.Assert(err, IsNil) + c.Assert(name, DeepEquals, NewCIStr("a")) + c.Assert(a, DeepEquals, A{Name: "abc"}) + c.Assert(len(newJob.String()), Greater, 0) + + b2, err := job.Encode(true) + c.Assert(err, IsNil) + newJob = &Job{} + err = newJob.Decode(b2) + c.Assert(err, IsNil) + name = CIStr{} + // Don't decode to a here. + err = newJob.DecodeArgs(&name) + c.Assert(err, IsNil) + c.Assert(name, DeepEquals, NewCIStr("a")) + c.Assert(len(newJob.String()), Greater, 0) + + job.State = JobStateDone + c.Assert(job.IsDone(), IsTrue) + c.Assert(job.IsFinished(), IsTrue) + c.Assert(job.IsRunning(), IsFalse) + c.Assert(job.IsSynced(), IsFalse) + c.Assert(job.IsRollbackDone(), IsFalse) + job.SetRowCount(3) + c.Assert(job.GetRowCount(), Equals, int64(3)) +} + +func (testModelSuite) TestState(c *C) { + schemaTbl := []SchemaState{ + StateDeleteOnly, + StateWriteOnly, + StateWriteReorganization, + StateDeleteReorganization, + StatePublic, + } + + for _, state := range schemaTbl { + c.Assert(len(state.String()), Greater, 0) + } + + jobTbl := []JobState{ + JobStateRunning, + JobStateDone, + JobStateCancelled, + JobStateRollingback, + JobStateRollbackDone, + JobStateSynced, + } + + for _, state := range jobTbl { + c.Assert(len(state.String()), Greater, 0) + } +} + +func (testModelSuite) TestString(c *C) { + acts := []struct { + act ActionType + result string + }{ + {ActionNone, "none"}, + {ActionAddForeignKey, "add foreign key"}, + {ActionDropForeignKey, "drop foreign key"}, + {ActionTruncateTable, "truncate table"}, + {ActionModifyColumn, "modify column"}, + {ActionRenameTable, "rename table"}, + {ActionSetDefaultValue, "set default value"}, + {ActionCreateSchema, "create schema"}, + {ActionDropSchema, "drop schema"}, + {ActionCreateTable, "create table"}, + {ActionDropTable, "drop table"}, + {ActionAddIndex, "add index"}, + {ActionDropIndex, "drop index"}, + {ActionAddColumn, "add column"}, + {ActionDropColumn, "drop column"}, + } + + for _, v := range acts { + str := v.act.String() + c.Assert(str, Equals, v.result) + } +} + +func (testModelSuite) TestUnmarshalCIStr(c *C) { + var ci CIStr + + // Test unmarshal CIStr from a single string. + str := "aaBB" + buf, err := json.Marshal(str) + c.Assert(err, IsNil) + ci.UnmarshalJSON(buf) + c.Assert(ci.O, Equals, str) + c.Assert(ci.L, Equals, "aabb") + + buf, err = json.Marshal(ci) + c.Assert(string(buf), Equals, `{"O":"aaBB","L":"aabb"}`) + ci.UnmarshalJSON(buf) + c.Assert(ci.O, Equals, str) + c.Assert(ci.L, Equals, "aabb") +} diff --git a/mysql/charset.go b/mysql/charset.go new file mode 100644 index 000000000..9cd96796e --- /dev/null +++ b/mysql/charset.go @@ -0,0 +1,608 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import "unicode" + +// CharsetIDs maps charset name to its default collation ID. +var CharsetIDs = map[string]uint8{ + "big5": 1, + "dec8": 3, + "cp850": 4, + "hp8": 6, + "koi8r": 7, + "latin1": 8, + "latin2": 9, + "swe7": 10, + "ascii": 11, + "ujis": 12, + "sjis": 13, + "hebrew": 16, + "tis620": 18, + "euckr": 19, + "koi8u": 22, + "gb2312": 24, + "greek": 25, + "cp1250": 26, + "gbk": 28, + "latin5": 30, + "armscii8": 32, + "utf8": 33, + "ucs2": 35, + "cp866": 36, + "keybcs2": 37, + "macce": 38, + "macroman": 39, + "cp852": 40, + "latin7": 41, + "utf8mb4": 45, + "cp1251": 51, + "utf16": 54, + "utf16le": 56, + "cp1256": 57, + "cp1257": 59, + "utf32": 60, + "binary": 63, + "geostd8": 92, + "cp932": 95, + "eucjpms": 97, +} + +// Charsets maps charset name to its default collation name. +var Charsets = map[string]string{ + "big5": "big5_chinese_ci", + "dec8": "dec8_swedish_ci", + "cp850": "cp850_general_ci", + "hp8": "hp8_english_ci", + "koi8r": "koi8r_general_ci", + "latin1": "latin1_swedish_ci", + "latin2": "latin2_general_ci", + "swe7": "swe7_swedish_ci", + "ascii": "ascii_general_ci", + "ujis": "ujis_japanese_ci", + "sjis": "sjis_japanese_ci", + "hebrew": "hebrew_general_ci", + "tis620": "tis620_thai_ci", + "euckr": "euckr_korean_ci", + "koi8u": "koi8u_general_ci", + "gb2312": "gb2312_chinese_ci", + "greek": "greek_general_ci", + "cp1250": "cp1250_general_ci", + "gbk": "gbk_chinese_ci", + "latin5": "latin5_turkish_ci", + "armscii8": "armscii8_general_ci", + "utf8": "utf8_general_ci", + "ucs2": "ucs2_general_ci", + "cp866": "cp866_general_ci", + "keybcs2": "keybcs2_general_ci", + "macce": "macce_general_ci", + "macroman": "macroman_general_ci", + "cp852": "cp852_general_ci", + "latin7": "latin7_general_ci", + "utf8mb4": "utf8mb4_general_ci", + "cp1251": "cp1251_general_ci", + "utf16": "utf16_general_ci", + "utf16le": "utf16le_general_ci", + "cp1256": "cp1256_general_ci", + "cp1257": "cp1257_general_ci", + "utf32": "utf32_general_ci", + "binary": "binary", + "geostd8": "geostd8_general_ci", + "cp932": "cp932_japanese_ci", + "eucjpms": "eucjpms_japanese_ci", +} + +// Collations maps MySQL default collation ID to its name. +var Collations = map[uint8]string{ + 1: "big5_chinese_ci", + 2: "latin2_czech_cs", + 3: "dec8_swedish_ci", + 4: "cp850_general_ci", + 5: "latin1_german1_ci", + 6: "hp8_english_ci", + 7: "koi8r_general_ci", + 8: "latin1_swedish_ci", + 9: "latin2_general_ci", + 10: "swe7_swedish_ci", + 11: "ascii_general_ci", + 12: "ujis_japanese_ci", + 13: "sjis_japanese_ci", + 14: "cp1251_bulgarian_ci", + 15: "latin1_danish_ci", + 16: "hebrew_general_ci", + 18: "tis620_thai_ci", + 19: "euckr_korean_ci", + 20: "latin7_estonian_cs", + 21: "latin2_hungarian_ci", + 22: "koi8u_general_ci", + 23: "cp1251_ukrainian_ci", + 24: "gb2312_chinese_ci", + 25: "greek_general_ci", + 26: "cp1250_general_ci", + 27: "latin2_croatian_ci", + 28: "gbk_chinese_ci", + 29: "cp1257_lithuanian_ci", + 30: "latin5_turkish_ci", + 31: "latin1_german2_ci", + 32: "armscii8_general_ci", + 33: "utf8_general_ci", + 34: "cp1250_czech_cs", + 35: "ucs2_general_ci", + 36: "cp866_general_ci", + 37: "keybcs2_general_ci", + 38: "macce_general_ci", + 39: "macroman_general_ci", + 40: "cp852_general_ci", + 41: "latin7_general_ci", + 42: "latin7_general_cs", + 43: "macce_bin", + 44: "cp1250_croatian_ci", + 45: "utf8mb4_general_ci", + 46: "utf8mb4_bin", + 47: "latin1_bin", + 48: "latin1_general_ci", + 49: "latin1_general_cs", + 50: "cp1251_bin", + 51: "cp1251_general_ci", + 52: "cp1251_general_cs", + 53: "macroman_bin", + 54: "utf16_general_ci", + 55: "utf16_bin", + 56: "utf16le_general_ci", + 57: "cp1256_general_ci", + 58: "cp1257_bin", + 59: "cp1257_general_ci", + 60: "utf32_general_ci", + 61: "utf32_bin", + 62: "utf16le_bin", + 63: "binary", + 64: "armscii8_bin", + 65: "ascii_bin", + 66: "cp1250_bin", + 67: "cp1256_bin", + 68: "cp866_bin", + 69: "dec8_bin", + 70: "greek_bin", + 71: "hebrew_bin", + 72: "hp8_bin", + 73: "keybcs2_bin", + 74: "koi8r_bin", + 75: "koi8u_bin", + 77: "latin2_bin", + 78: "latin5_bin", + 79: "latin7_bin", + 80: "cp850_bin", + 81: "cp852_bin", + 82: "swe7_bin", + 83: "utf8_bin", + 84: "big5_bin", + 85: "euckr_bin", + 86: "gb2312_bin", + 87: "gbk_bin", + 88: "sjis_bin", + 89: "tis620_bin", + 90: "ucs2_bin", + 91: "ujis_bin", + 92: "geostd8_general_ci", + 93: "geostd8_bin", + 94: "latin1_spanish_ci", + 95: "cp932_japanese_ci", + 96: "cp932_bin", + 97: "eucjpms_japanese_ci", + 98: "eucjpms_bin", + 99: "cp1250_polish_ci", + 101: "utf16_unicode_ci", + 102: "utf16_icelandic_ci", + 103: "utf16_latvian_ci", + 104: "utf16_romanian_ci", + 105: "utf16_slovenian_ci", + 106: "utf16_polish_ci", + 107: "utf16_estonian_ci", + 108: "utf16_spanish_ci", + 109: "utf16_swedish_ci", + 110: "utf16_turkish_ci", + 111: "utf16_czech_ci", + 112: "utf16_danish_ci", + 113: "utf16_lithuanian_ci", + 114: "utf16_slovak_ci", + 115: "utf16_spanish2_ci", + 116: "utf16_roman_ci", + 117: "utf16_persian_ci", + 118: "utf16_esperanto_ci", + 119: "utf16_hungarian_ci", + 120: "utf16_sinhala_ci", + 121: "utf16_german2_ci", + 122: "utf16_croatian_ci", + 123: "utf16_unicode_520_ci", + 124: "utf16_vietnamese_ci", + 128: "ucs2_unicode_ci", + 129: "ucs2_icelandic_ci", + 130: "ucs2_latvian_ci", + 131: "ucs2_romanian_ci", + 132: "ucs2_slovenian_ci", + 133: "ucs2_polish_ci", + 134: "ucs2_estonian_ci", + 135: "ucs2_spanish_ci", + 136: "ucs2_swedish_ci", + 137: "ucs2_turkish_ci", + 138: "ucs2_czech_ci", + 139: "ucs2_danish_ci", + 140: "ucs2_lithuanian_ci", + 141: "ucs2_slovak_ci", + 142: "ucs2_spanish2_ci", + 143: "ucs2_roman_ci", + 144: "ucs2_persian_ci", + 145: "ucs2_esperanto_ci", + 146: "ucs2_hungarian_ci", + 147: "ucs2_sinhala_ci", + 148: "ucs2_german2_ci", + 149: "ucs2_croatian_ci", + 150: "ucs2_unicode_520_ci", + 151: "ucs2_vietnamese_ci", + 159: "ucs2_general_mysql500_ci", + 160: "utf32_unicode_ci", + 161: "utf32_icelandic_ci", + 162: "utf32_latvian_ci", + 163: "utf32_romanian_ci", + 164: "utf32_slovenian_ci", + 165: "utf32_polish_ci", + 166: "utf32_estonian_ci", + 167: "utf32_spanish_ci", + 168: "utf32_swedish_ci", + 169: "utf32_turkish_ci", + 170: "utf32_czech_ci", + 171: "utf32_danish_ci", + 172: "utf32_lithuanian_ci", + 173: "utf32_slovak_ci", + 174: "utf32_spanish2_ci", + 175: "utf32_roman_ci", + 176: "utf32_persian_ci", + 177: "utf32_esperanto_ci", + 178: "utf32_hungarian_ci", + 179: "utf32_sinhala_ci", + 180: "utf32_german2_ci", + 181: "utf32_croatian_ci", + 182: "utf32_unicode_520_ci", + 183: "utf32_vietnamese_ci", + 192: "utf8_unicode_ci", + 193: "utf8_icelandic_ci", + 194: "utf8_latvian_ci", + 195: "utf8_romanian_ci", + 196: "utf8_slovenian_ci", + 197: "utf8_polish_ci", + 198: "utf8_estonian_ci", + 199: "utf8_spanish_ci", + 200: "utf8_swedish_ci", + 201: "utf8_turkish_ci", + 202: "utf8_czech_ci", + 203: "utf8_danish_ci", + 204: "utf8_lithuanian_ci", + 205: "utf8_slovak_ci", + 206: "utf8_spanish2_ci", + 207: "utf8_roman_ci", + 208: "utf8_persian_ci", + 209: "utf8_esperanto_ci", + 210: "utf8_hungarian_ci", + 211: "utf8_sinhala_ci", + 212: "utf8_german2_ci", + 213: "utf8_croatian_ci", + 214: "utf8_unicode_520_ci", + 215: "utf8_vietnamese_ci", + 223: "utf8_general_mysql500_ci", + 224: "utf8mb4_unicode_ci", + 225: "utf8mb4_icelandic_ci", + 226: "utf8mb4_latvian_ci", + 227: "utf8mb4_romanian_ci", + 228: "utf8mb4_slovenian_ci", + 229: "utf8mb4_polish_ci", + 230: "utf8mb4_estonian_ci", + 231: "utf8mb4_spanish_ci", + 232: "utf8mb4_swedish_ci", + 233: "utf8mb4_turkish_ci", + 234: "utf8mb4_czech_ci", + 235: "utf8mb4_danish_ci", + 236: "utf8mb4_lithuanian_ci", + 237: "utf8mb4_slovak_ci", + 238: "utf8mb4_spanish2_ci", + 239: "utf8mb4_roman_ci", + 240: "utf8mb4_persian_ci", + 241: "utf8mb4_esperanto_ci", + 242: "utf8mb4_hungarian_ci", + 243: "utf8mb4_sinhala_ci", + 244: "utf8mb4_german2_ci", + 245: "utf8mb4_croatian_ci", + 246: "utf8mb4_unicode_520_ci", + 247: "utf8mb4_vietnamese_ci", +} + +// CollationNames maps MySQL default collation name to its ID +var CollationNames = map[string]uint8{ + "big5_chinese_ci": 1, + "latin2_czech_cs": 2, + "dec8_swedish_ci": 3, + "cp850_general_ci": 4, + "latin1_german1_ci": 5, + "hp8_english_ci": 6, + "koi8r_general_ci": 7, + "latin1_swedish_ci": 8, + "latin2_general_ci": 9, + "swe7_swedish_ci": 10, + "ascii_general_ci": 11, + "ujis_japanese_ci": 12, + "sjis_japanese_ci": 13, + "cp1251_bulgarian_ci": 14, + "latin1_danish_ci": 15, + "hebrew_general_ci": 16, + "tis620_thai_ci": 18, + "euckr_korean_ci": 19, + "latin7_estonian_cs": 20, + "latin2_hungarian_ci": 21, + "koi8u_general_ci": 22, + "cp1251_ukrainian_ci": 23, + "gb2312_chinese_ci": 24, + "greek_general_ci": 25, + "cp1250_general_ci": 26, + "latin2_croatian_ci": 27, + "gbk_chinese_ci": 28, + "cp1257_lithuanian_ci": 29, + "latin5_turkish_ci": 30, + "latin1_german2_ci": 31, + "armscii8_general_ci": 32, + "utf8_general_ci": 33, + "cp1250_czech_cs": 34, + "ucs2_general_ci": 35, + "cp866_general_ci": 36, + "keybcs2_general_ci": 37, + "macce_general_ci": 38, + "macroman_general_ci": 39, + "cp852_general_ci": 40, + "latin7_general_ci": 41, + "latin7_general_cs": 42, + "macce_bin": 43, + "cp1250_croatian_ci": 44, + "utf8mb4_general_ci": 45, + "utf8mb4_bin": 46, + "latin1_bin": 47, + "latin1_general_ci": 48, + "latin1_general_cs": 49, + "cp1251_bin": 50, + "cp1251_general_ci": 51, + "cp1251_general_cs": 52, + "macroman_bin": 53, + "utf16_general_ci": 54, + "utf16_bin": 55, + "utf16le_general_ci": 56, + "cp1256_general_ci": 57, + "cp1257_bin": 58, + "cp1257_general_ci": 59, + "utf32_general_ci": 60, + "utf32_bin": 61, + "utf16le_bin": 62, + "binary": 63, + "armscii8_bin": 64, + "ascii_bin": 65, + "cp1250_bin": 66, + "cp1256_bin": 67, + "cp866_bin": 68, + "dec8_bin": 69, + "greek_bin": 70, + "hebrew_bin": 71, + "hp8_bin": 72, + "keybcs2_bin": 73, + "koi8r_bin": 74, + "koi8u_bin": 75, + "latin2_bin": 77, + "latin5_bin": 78, + "latin7_bin": 79, + "cp850_bin": 80, + "cp852_bin": 81, + "swe7_bin": 82, + "utf8_bin": 83, + "big5_bin": 84, + "euckr_bin": 85, + "gb2312_bin": 86, + "gbk_bin": 87, + "sjis_bin": 88, + "tis620_bin": 89, + "ucs2_bin": 90, + "ujis_bin": 91, + "geostd8_general_ci": 92, + "geostd8_bin": 93, + "latin1_spanish_ci": 94, + "cp932_japanese_ci": 95, + "cp932_bin": 96, + "eucjpms_japanese_ci": 97, + "eucjpms_bin": 98, + "cp1250_polish_ci": 99, + "utf16_unicode_ci": 101, + "utf16_icelandic_ci": 102, + "utf16_latvian_ci": 103, + "utf16_romanian_ci": 104, + "utf16_slovenian_ci": 105, + "utf16_polish_ci": 106, + "utf16_estonian_ci": 107, + "utf16_spanish_ci": 108, + "utf16_swedish_ci": 109, + "utf16_turkish_ci": 110, + "utf16_czech_ci": 111, + "utf16_danish_ci": 112, + "utf16_lithuanian_ci": 113, + "utf16_slovak_ci": 114, + "utf16_spanish2_ci": 115, + "utf16_roman_ci": 116, + "utf16_persian_ci": 117, + "utf16_esperanto_ci": 118, + "utf16_hungarian_ci": 119, + "utf16_sinhala_ci": 120, + "utf16_german2_ci": 121, + "utf16_croatian_ci": 122, + "utf16_unicode_520_ci": 123, + "utf16_vietnamese_ci": 124, + "ucs2_unicode_ci": 128, + "ucs2_icelandic_ci": 129, + "ucs2_latvian_ci": 130, + "ucs2_romanian_ci": 131, + "ucs2_slovenian_ci": 132, + "ucs2_polish_ci": 133, + "ucs2_estonian_ci": 134, + "ucs2_spanish_ci": 135, + "ucs2_swedish_ci": 136, + "ucs2_turkish_ci": 137, + "ucs2_czech_ci": 138, + "ucs2_danish_ci": 139, + "ucs2_lithuanian_ci": 140, + "ucs2_slovak_ci": 141, + "ucs2_spanish2_ci": 142, + "ucs2_roman_ci": 143, + "ucs2_persian_ci": 144, + "ucs2_esperanto_ci": 145, + "ucs2_hungarian_ci": 146, + "ucs2_sinhala_ci": 147, + "ucs2_german2_ci": 148, + "ucs2_croatian_ci": 149, + "ucs2_unicode_520_ci": 150, + "ucs2_vietnamese_ci": 151, + "ucs2_general_mysql500_ci": 159, + "utf32_unicode_ci": 160, + "utf32_icelandic_ci": 161, + "utf32_latvian_ci": 162, + "utf32_romanian_ci": 163, + "utf32_slovenian_ci": 164, + "utf32_polish_ci": 165, + "utf32_estonian_ci": 166, + "utf32_spanish_ci": 167, + "utf32_swedish_ci": 168, + "utf32_turkish_ci": 169, + "utf32_czech_ci": 170, + "utf32_danish_ci": 171, + "utf32_lithuanian_ci": 172, + "utf32_slovak_ci": 173, + "utf32_spanish2_ci": 174, + "utf32_roman_ci": 175, + "utf32_persian_ci": 176, + "utf32_esperanto_ci": 177, + "utf32_hungarian_ci": 178, + "utf32_sinhala_ci": 179, + "utf32_german2_ci": 180, + "utf32_croatian_ci": 181, + "utf32_unicode_520_ci": 182, + "utf32_vietnamese_ci": 183, + "utf8_unicode_ci": 192, + "utf8_icelandic_ci": 193, + "utf8_latvian_ci": 194, + "utf8_romanian_ci": 195, + "utf8_slovenian_ci": 196, + "utf8_polish_ci": 197, + "utf8_estonian_ci": 198, + "utf8_spanish_ci": 199, + "utf8_swedish_ci": 200, + "utf8_turkish_ci": 201, + "utf8_czech_ci": 202, + "utf8_danish_ci": 203, + "utf8_lithuanian_ci": 204, + "utf8_slovak_ci": 205, + "utf8_spanish2_ci": 206, + "utf8_roman_ci": 207, + "utf8_persian_ci": 208, + "utf8_esperanto_ci": 209, + "utf8_hungarian_ci": 210, + "utf8_sinhala_ci": 211, + "utf8_german2_ci": 212, + "utf8_croatian_ci": 213, + "utf8_unicode_520_ci": 214, + "utf8_vietnamese_ci": 215, + "utf8_general_mysql500_ci": 223, + "utf8mb4_unicode_ci": 224, + "utf8mb4_icelandic_ci": 225, + "utf8mb4_latvian_ci": 226, + "utf8mb4_romanian_ci": 227, + "utf8mb4_slovenian_ci": 228, + "utf8mb4_polish_ci": 229, + "utf8mb4_estonian_ci": 230, + "utf8mb4_spanish_ci": 231, + "utf8mb4_swedish_ci": 232, + "utf8mb4_turkish_ci": 233, + "utf8mb4_czech_ci": 234, + "utf8mb4_danish_ci": 235, + "utf8mb4_lithuanian_ci": 236, + "utf8mb4_slovak_ci": 237, + "utf8mb4_spanish2_ci": 238, + "utf8mb4_roman_ci": 239, + "utf8mb4_persian_ci": 240, + "utf8mb4_esperanto_ci": 241, + "utf8mb4_hungarian_ci": 242, + "utf8mb4_sinhala_ci": 243, + "utf8mb4_german2_ci": 244, + "utf8mb4_croatian_ci": 245, + "utf8mb4_unicode_520_ci": 246, + "utf8mb4_vietnamese_ci": 247, +} + +// MySQL collation information. +const ( + UTF8Charset = "utf8" + UTF8MB4Charset = "utf8mb4" + DefaultCharset = UTF8Charset + DefaultCollationID = 83 + BinaryCollationID = 63 + UTF8DefaultCollation = "utf8_bin" + DefaultCollationName = UTF8DefaultCollation + + // MaxBytesOfCharacter, is the max bytes length of a character, + // refer to RFC3629, in UTF-8, characters from the U+0000..U+10FFFF range + // (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets. + MaxBytesOfCharacter = 4 +) + +// IsUTF8Charset checks if charset is utf8 or utf8mb4 +func IsUTF8Charset(charset string) bool { + return charset == UTF8Charset || charset == UTF8MB4Charset +} + +// RangeGraph defines valid unicode characters to use in column names. It strictly follows MySQL's definition. +// See #3994. +var RangeGraph = []*unicode.RangeTable{ + // _MY_PNT + unicode.No, + unicode.Mn, + unicode.Me, + unicode.Pc, + unicode.Pd, + unicode.Pd, + unicode.Ps, + unicode.Pe, + unicode.Pi, + unicode.Pf, + unicode.Po, + unicode.Sm, + unicode.Sc, + unicode.Sk, + unicode.So, + // _MY_U + unicode.Lu, + unicode.Lt, + unicode.Nl, + // _MY_L + unicode.Ll, + unicode.Lm, + unicode.Lo, + unicode.Nl, + unicode.Mn, + unicode.Mc, + unicode.Me, + // _MY_NMR + unicode.Nd, + unicode.Nl, + unicode.No, +} diff --git a/mysql/const.go b/mysql/const.go new file mode 100644 index 000000000..47623f180 --- /dev/null +++ b/mysql/const.go @@ -0,0 +1,695 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "fmt" + "strings" +) + +func newInvalidModeErr(s string) error { + return NewErr(ErrWrongValueForVar, "sql_mode", s) +} + +// Version information. +var ( + // TiDBReleaseVersion is initialized by (git describe --tags) in Makefile. + TiDBReleaseVersion = "None" + + // ServerVersion is the version information of this tidb-server in MySQL's format. + ServerVersion = fmt.Sprintf("5.7.10-TiDB-%s", TiDBReleaseVersion) +) + +// Header information. +const ( + OKHeader byte = 0x00 + ErrHeader byte = 0xff + EOFHeader byte = 0xfe + LocalInFileHeader byte = 0xfb +) + +// Server information. +const ( + ServerStatusInTrans uint16 = 0x0001 + ServerStatusAutocommit uint16 = 0x0002 + ServerMoreResultsExists uint16 = 0x0008 + ServerStatusNoGoodIndexUsed uint16 = 0x0010 + ServerStatusNoIndexUsed uint16 = 0x0020 + ServerStatusCursorExists uint16 = 0x0040 + ServerStatusLastRowSend uint16 = 0x0080 + ServerStatusDBDropped uint16 = 0x0100 + ServerStatusNoBackslashEscaped uint16 = 0x0200 + ServerStatusMetadataChanged uint16 = 0x0400 + ServerStatusWasSlow uint16 = 0x0800 + ServerPSOutParams uint16 = 0x1000 +) + +// HasCursorExistsFlag return true if cursor exists indicated by server status. +func HasCursorExistsFlag(serverStatus uint16) bool { + return serverStatus&ServerStatusCursorExists > 0 +} + +// Identifier length limitations. +// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html +const ( + // MaxPayloadLen is the max packet payload length. + MaxPayloadLen = 1<<24 - 1 + // MaxTableNameLength is max length of table name identifier. + MaxTableNameLength = 64 + // MaxDatabaseNameLength is max length of database name identifier. + MaxDatabaseNameLength = 64 + // MaxColumnNameLength is max length of column name identifier. + MaxColumnNameLength = 64 + // MaxKeyParts is max length of key parts. + MaxKeyParts = 16 + // MaxIndexIdentifierLen is max length of index identifier. + MaxIndexIdentifierLen = 64 + // MaxConstraintIdentifierLen is max length of constrain identifier. + MaxConstraintIdentifierLen = 64 + // MaxViewIdentifierLen is max length of view identifier. + MaxViewIdentifierLen = 64 + // MaxAliasIdentifierLen is max length of alias identifier. + MaxAliasIdentifierLen = 256 + // MaxUserDefinedVariableLen is max length of user-defined variable. + MaxUserDefinedVariableLen = 64 +) + +// ErrTextLength error text length limit. +const ErrTextLength = 80 + +// Command information. +const ( + ComSleep byte = iota + ComQuit + ComInitDB + ComQuery + ComFieldList + ComCreateDB + ComDropDB + ComRefresh + ComShutdown + ComStatistics + ComProcessInfo + ComConnect + ComProcessKill + ComDebug + ComPing + ComTime + ComDelayedInsert + ComChangeUser + ComBinlogDump + ComTableDump + ComConnectOut + ComRegisterSlave + ComStmtPrepare + ComStmtExecute + ComStmtSendLongData + ComStmtClose + ComStmtReset + ComSetOption + ComStmtFetch + ComDaemon + ComBinlogDumpGtid + ComResetConnection + ComEnd +) + +// Client information. +const ( + ClientLongPassword uint32 = 1 << iota + ClientFoundRows + ClientLongFlag + ClientConnectWithDB + ClientNoSchema + ClientCompress + ClientODBC + ClientLocalFiles + ClientIgnoreSpace + ClientProtocol41 + ClientInteractive + ClientSSL + ClientIgnoreSigpipe + ClientTransactions + ClientReserved + ClientSecureConnection + ClientMultiStatements + ClientMultiResults + ClientPSMultiResults + ClientPluginAuth + ClientConnectAtts + ClientPluginAuthLenencClientData +) + +// Cache type information. +const ( + TypeNoCache byte = 0xff +) + +// Auth name information. +const ( + AuthName = "mysql_native_password" +) + +// MySQL database and tables. +const ( + // SystemDB is the name of system database. + SystemDB = "mysql" + // UserTable is the table in system db contains user info. + UserTable = "User" + // DBTable is the table in system db contains db scope privilege info. + DBTable = "DB" + // TablePrivTable is the table in system db contains table scope privilege info. + TablePrivTable = "Tables_priv" + // ColumnPrivTable is the table in system db contains column scope privilege info. + ColumnPrivTable = "Columns_priv" + // GlobalVariablesTable is the table contains global system variables. + GlobalVariablesTable = "GLOBAL_VARIABLES" + // GlobalStatusTable is the table contains global status variables. + GlobalStatusTable = "GLOBAL_STATUS" + // TiDBTable is the table contains tidb info. + TiDBTable = "tidb" +) + +// PrivilegeType privilege +type PrivilegeType uint32 + +const ( + _ PrivilegeType = 1 << iota + // CreatePriv is the privilege to create schema/table. + CreatePriv + // SelectPriv is the privilege to read from table. + SelectPriv + // InsertPriv is the privilege to insert data into table. + InsertPriv + // UpdatePriv is the privilege to update data in table. + UpdatePriv + // DeletePriv is the privilege to delete data from table. + DeletePriv + // ShowDBPriv is the privilege to run show databases statement. + ShowDBPriv + // SuperPriv enables many operations and server behaviors. + SuperPriv + // CreateUserPriv is the privilege to create user. + CreateUserPriv + // TriggerPriv is not checked yet. + TriggerPriv + // DropPriv is the privilege to drop schema/table. + DropPriv + // ProcessPriv pertains to display of information about the threads executing within the server. + ProcessPriv + // GrantPriv is the privilege to grant privilege to user. + GrantPriv + // ReferencesPriv is not checked yet. + ReferencesPriv + // AlterPriv is the privilege to run alter statement. + AlterPriv + // ExecutePriv is the privilege to run execute statement. + ExecutePriv + // IndexPriv is the privilege to create/drop index. + IndexPriv + // AllPriv is the privilege for all actions. + AllPriv +) + +// AllPrivMask is the mask for PrivilegeType with all bits set to 1. +// If it's passed to RequestVerification, it means any privilege would be OK. +const AllPrivMask = AllPriv - 1 + +// MySQL type maximum length. +const ( + // For arguments that have no fixed number of decimals, the decimals value is set to 31, + // which is 1 more than the maximum number of decimals permitted for the DECIMAL, FLOAT, and DOUBLE data types. + NotFixedDec = 31 + + MaxIntWidth = 20 + MaxRealWidth = 23 + MaxFloatingTypeScale = 30 + MaxFloatingTypeWidth = 255 + MaxDecimalScale = 30 + MaxDecimalWidth = 65 + MaxDateWidth = 10 // YYYY-MM-DD. + MaxDatetimeWidthNoFsp = 19 // YYYY-MM-DD HH:MM:SS + MaxDatetimeWidthWithFsp = 26 // YYYY-MM-DD HH:MM:SS[.fraction] + MaxDatetimeFullWidth = 29 // YYYY-MM-DD HH:MM:SS.###### AM + MaxDurationWidthNoFsp = 10 // HH:MM:SS + MaxDurationWidthWithFsp = 15 // HH:MM:SS[.fraction] + MaxBlobWidth = 16777216 +) + +// MySQL max type field length. +const ( + MaxFieldCharLength = 255 + MaxFieldVarCharLength = 65535 +) + +// MaxTypeSetMembers is the number of set members. +const MaxTypeSetMembers = 64 + +// PWDHashLen is the length of password's hash. +const PWDHashLen = 40 + +// Priv2UserCol is the privilege to mysql.user table column name. +var Priv2UserCol = map[PrivilegeType]string{ + CreatePriv: "Create_priv", + SelectPriv: "Select_priv", + InsertPriv: "Insert_priv", + UpdatePriv: "Update_priv", + DeletePriv: "Delete_priv", + ShowDBPriv: "Show_db_priv", + SuperPriv: "Super_priv", + CreateUserPriv: "Create_user_priv", + TriggerPriv: "Trigger_priv", + DropPriv: "Drop_priv", + ProcessPriv: "Process_priv", + GrantPriv: "Grant_priv", + ReferencesPriv: "References_priv", + AlterPriv: "Alter_priv", + ExecutePriv: "Execute_priv", + IndexPriv: "Index_priv", +} + +// Command2Str is the command information to command name. +var Command2Str = map[byte]string{ + ComSleep: "Sleep", + ComQuit: "Quit", + ComInitDB: "Init DB", + ComQuery: "Query", + ComFieldList: "Field List", + ComCreateDB: "Create DB", + ComDropDB: "Drop DB", + ComRefresh: "Refresh", + ComShutdown: "Shutdown", + ComStatistics: "Statistics", + ComProcessInfo: "Processlist", + ComConnect: "Connect", + ComProcessKill: "Kill", + ComDebug: "Debug", + ComPing: "Ping", + ComTime: "Time", + ComDelayedInsert: "Delayed Insert", + ComChangeUser: "Change User", + ComBinlogDump: "Binlog Dump", + ComTableDump: "Table Dump", + ComConnectOut: "Connect out", + ComRegisterSlave: "Register Slave", + ComStmtPrepare: "Prepare", + ComStmtExecute: "Execute", + ComStmtSendLongData: "Long Data", + ComStmtClose: "Close stmt", + ComStmtReset: "Reset stmt", + ComSetOption: "Set option", + ComStmtFetch: "Fetch", + ComDaemon: "Daemon", + ComBinlogDumpGtid: "Binlog Dump", + ComResetConnection: "Reset connect", +} + +// Col2PrivType is the privilege tables column name to privilege type. +var Col2PrivType = map[string]PrivilegeType{ + "Create_priv": CreatePriv, + "Select_priv": SelectPriv, + "Insert_priv": InsertPriv, + "Update_priv": UpdatePriv, + "Delete_priv": DeletePriv, + "Show_db_priv": ShowDBPriv, + "Super_priv": SuperPriv, + "Create_user_priv": CreateUserPriv, + "Trigger_priv": TriggerPriv, + "Drop_priv": DropPriv, + "Process_priv": ProcessPriv, + "Grant_priv": GrantPriv, + "References_priv": ReferencesPriv, + "Alter_priv": AlterPriv, + "Execute_priv": ExecutePriv, + "Index_priv": IndexPriv, +} + +// AllGlobalPrivs is all the privileges in global scope. +var AllGlobalPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ProcessPriv, GrantPriv, ReferencesPriv, AlterPriv, ShowDBPriv, SuperPriv, ExecutePriv, IndexPriv, CreateUserPriv, TriggerPriv} + +// Priv2Str is the map for privilege to string. +var Priv2Str = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + ShowDBPriv: "Show Databases", + SuperPriv: "Super", + CreateUserPriv: "Create User", + TriggerPriv: "Trigger", + DropPriv: "Drop", + ProcessPriv: "Process", + GrantPriv: "Grant Option", + ReferencesPriv: "References", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", +} + +// Priv2SetStr is the map for privilege to string. +var Priv2SetStr = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + DropPriv: "Drop", + GrantPriv: "Grant", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", +} + +// SetStr2Priv is the map for privilege set string to privilege type. +var SetStr2Priv = map[string]PrivilegeType{ + "Create": CreatePriv, + "Select": SelectPriv, + "Insert": InsertPriv, + "Update": UpdatePriv, + "Delete": DeletePriv, + "Drop": DropPriv, + "Grant": GrantPriv, + "Alter": AlterPriv, + "Execute": ExecutePriv, + "Index": IndexPriv, +} + +// AllDBPrivs is all the privileges in database scope. +var AllDBPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, ExecutePriv, IndexPriv} + +// AllTablePrivs is all the privileges in table scope. +var AllTablePrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, GrantPriv, AlterPriv, IndexPriv} + +// AllColumnPrivs is all the privileges in column scope. +var AllColumnPrivs = []PrivilegeType{SelectPriv, InsertPriv, UpdatePriv} + +// AllPrivilegeLiteral is the string literal for All Privilege. +const AllPrivilegeLiteral = "ALL PRIVILEGES" + +// DefaultSQLMode for GLOBAL_VARIABLES +const DefaultSQLMode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" + +// DefaultLengthOfMysqlTypes is the map for default physical length of MySQL data types. +// See http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +var DefaultLengthOfMysqlTypes = map[byte]int{ + TypeYear: 1, + TypeDate: 3, + TypeDuration: 3, + TypeDatetime: 8, + TypeTimestamp: 4, + + TypeTiny: 1, + TypeShort: 2, + TypeInt24: 3, + TypeLong: 4, + TypeLonglong: 8, + TypeFloat: 4, + TypeDouble: 8, + + TypeEnum: 2, + TypeString: 1, + TypeSet: 8, +} + +// DefaultLengthOfTimeFraction is the map for default physical length of time fractions. +var DefaultLengthOfTimeFraction = map[int]int{ + 0: 0, + + 1: 1, + 2: 1, + + 3: 2, + 4: 2, + + 5: 3, + 6: 3, +} + +// SQLMode is the type for MySQL sql_mode. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html +type SQLMode int + +// HasNoZeroDateMode detects if 'NO_ZERO_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroDateMode() bool { + return m&ModeNoZeroDate == ModeNoZeroDate +} + +// HasNoZeroInDateMode detects if 'NO_ZERO_IN_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroInDateMode() bool { + return m&ModeNoZeroInDate == ModeNoZeroInDate +} + +// HasErrorForDivisionByZeroMode detects if 'ERROR_FOR_DIVISION_BY_ZERO' mode is set in SQLMode +func (m SQLMode) HasErrorForDivisionByZeroMode() bool { + return m&ModeErrorForDivisionByZero == ModeErrorForDivisionByZero +} + +// HasOnlyFullGroupBy detects if 'ONLY_FULL_GROUP_BY' mode is set in SQLMode +func (m SQLMode) HasOnlyFullGroupBy() bool { + return m&ModeOnlyFullGroupBy == ModeOnlyFullGroupBy +} + +// HasStrictMode detects if 'STRICT_TRANS_TABLES' or 'STRICT_ALL_TABLES' mode is set in SQLMode +func (m SQLMode) HasStrictMode() bool { + return m&ModeStrictTransTables == ModeStrictTransTables || m&ModeStrictAllTables == ModeStrictAllTables +} + +// HasPipesAsConcatMode detects if 'PIPES_AS_CONCAT' mode is set in SQLMode +func (m SQLMode) HasPipesAsConcatMode() bool { + return m&ModePipesAsConcat == ModePipesAsConcat +} + +// HasNoUnsignedSubtractionMode detects if 'NO_UNSIGNED_SUBTRACTION' mode is set in SQLMode +func (m SQLMode) HasNoUnsignedSubtractionMode() bool { + return m&ModeNoUnsignedSubtraction == ModeNoUnsignedSubtraction +} + +// HasHighNotPrecedenceMode detects if 'HIGH_NOT_PRECEDENCE' mode is set in SQLMode +func (m SQLMode) HasHighNotPrecedenceMode() bool { + return m&ModeHighNotPrecedence == ModeHighNotPrecedence +} + +// HasANSIQuotesMode detects if 'ANSI_QUOTES' mode is set in SQLMode +func (m SQLMode) HasANSIQuotesMode() bool { + return m&ModeANSIQuotes == ModeANSIQuotes +} + +// HasRealAsFloatMode detects if 'REAL_AS_FLOAT' mode is set in SQLMode +func (m SQLMode) HasRealAsFloatMode() bool { + return m&ModeRealAsFloat == ModeRealAsFloat +} + +// HasPadCharToFullLengthMode detects if 'PAD_CHAR_TO_FULL_LENGTH' mode is set in SQLMode +func (m SQLMode) HasPadCharToFullLengthMode() bool { + return m&ModePadCharToFullLength == ModePadCharToFullLength +} + +// HasNoBackslashEscapesMode detects if 'NO_BACKSLASH_ESCAPES' mode is set in SQLMode +func (m SQLMode) HasNoBackslashEscapesMode() bool { + return m&ModeNoBackslashEscapes == ModeNoBackslashEscapes +} + +// HasIgnoreSpaceMode detects if 'IGNORE_SPACE' mode is set in SQLMode +func (m SQLMode) HasIgnoreSpaceMode() bool { + return m&ModeIgnoreSpace == ModeIgnoreSpace +} + +// consts for sql modes. +const ( + ModeNone SQLMode = 0 + ModeRealAsFloat SQLMode = 1 << iota + ModePipesAsConcat + ModeANSIQuotes + ModeIgnoreSpace + ModeNotUsed + ModeOnlyFullGroupBy + ModeNoUnsignedSubtraction + ModeNoDirInCreate + ModePostgreSQL + ModeOracle + ModeMsSQL + ModeDb2 + ModeMaxdb + ModeNoKeyOptions + ModeNoTableOptions + ModeNoFieldOptions + ModeMySQL323 + ModeMySQL40 + ModeANSI + ModeNoAutoValueOnZero + ModeNoBackslashEscapes + ModeStrictTransTables + ModeStrictAllTables + ModeNoZeroInDate + ModeNoZeroDate + ModeInvalidDates + ModeErrorForDivisionByZero + ModeTraditional + ModeNoAutoCreateUser + ModeHighNotPrecedence + ModeNoEngineSubstitution + ModePadCharToFullLength +) + +// FormatSQLModeStr re-format 'SQL_MODE' variable. +func FormatSQLModeStr(s string) string { + s = strings.ToUpper(strings.TrimRight(s, " ")) + parts := strings.Split(s, ",") + var nonEmptyParts []string + existParts := make(map[string]string) + for _, part := range parts { + if len(part) == 0 { + continue + } + if modeParts, ok := CombinationSQLMode[part]; ok { + for _, modePart := range modeParts { + if _, exist := existParts[modePart]; !exist { + nonEmptyParts = append(nonEmptyParts, modePart) + existParts[modePart] = modePart + } + } + } + if _, exist := existParts[part]; !exist { + nonEmptyParts = append(nonEmptyParts, part) + existParts[part] = part + } + } + return strings.Join(nonEmptyParts, ",") +} + +// GetSQLMode gets the sql mode for string literal. SQL_mode is a list of different modes separated by commas. +// The input string must be formatted by 'FormatSQLModeStr' +func GetSQLMode(s string) (SQLMode, error) { + strs := strings.Split(s, ",") + var sqlMode SQLMode + for i, length := 0, len(strs); i < length; i++ { + mode, ok := Str2SQLMode[strs[i]] + if !ok && strs[i] != "" { + return sqlMode, newInvalidModeErr(strs[i]) + } + sqlMode = sqlMode | mode + } + return sqlMode, nil +} + +// Str2SQLMode is the string represent of sql_mode to sql_mode map. +var Str2SQLMode = map[string]SQLMode{ + "REAL_AS_FLOAT": ModeRealAsFloat, + "PIPES_AS_CONCAT": ModePipesAsConcat, + "ANSI_QUOTES": ModeANSIQuotes, + "IGNORE_SPACE": ModeIgnoreSpace, + "NOT_USED": ModeNotUsed, + "ONLY_FULL_GROUP_BY": ModeOnlyFullGroupBy, + "NO_UNSIGNED_SUBTRACTION": ModeNoUnsignedSubtraction, + "NO_DIR_IN_CREATE": ModeNoDirInCreate, + "POSTGRESQL": ModePostgreSQL, + "ORACLE": ModeOracle, + "MSSQL": ModeMsSQL, + "DB2": ModeDb2, + "MAXDB": ModeMaxdb, + "NO_KEY_OPTIONS": ModeNoKeyOptions, + "NO_TABLE_OPTIONS": ModeNoTableOptions, + "NO_FIELD_OPTIONS": ModeNoFieldOptions, + "MYSQL323": ModeMySQL323, + "MYSQL40": ModeMySQL40, + "ANSI": ModeANSI, + "NO_AUTO_VALUE_ON_ZERO": ModeNoAutoValueOnZero, + "NO_BACKSLASH_ESCAPES": ModeNoBackslashEscapes, + "STRICT_TRANS_TABLES": ModeStrictTransTables, + "STRICT_ALL_TABLES": ModeStrictAllTables, + "NO_ZERO_IN_DATE": ModeNoZeroInDate, + "NO_ZERO_DATE": ModeNoZeroDate, + "INVALID_DATES": ModeInvalidDates, + "ERROR_FOR_DIVISION_BY_ZERO": ModeErrorForDivisionByZero, + "TRADITIONAL": ModeTraditional, + "NO_AUTO_CREATE_USER": ModeNoAutoCreateUser, + "HIGH_NOT_PRECEDENCE": ModeHighNotPrecedence, + "NO_ENGINE_SUBSTITUTION": ModeNoEngineSubstitution, + "PAD_CHAR_TO_FULL_LENGTH": ModePadCharToFullLength, +} + +// CombinationSQLMode is the special modes that provided as shorthand for combinations of mode values. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-combo. +var CombinationSQLMode = map[string][]string{ + "ANSI": {"REAL_AS_FLOAT", "PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "ONLY_FULL_GROUP_BY"}, + "DB2": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "MAXDB": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "NO_AUTO_CREATE_USER"}, + "MSSQL": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "MYSQL323": {"MYSQL323", "HIGH_NOT_PRECEDENCE"}, + "MYSQL40": {"MYSQL40", "HIGH_NOT_PRECEDENCE"}, + "ORACLE": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "NO_AUTO_CREATE_USER"}, + "POSTGRESQL": {"PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS"}, + "TRADITIONAL": {"STRICT_TRANS_TABLES", "STRICT_ALL_TABLES", "NO_ZERO_IN_DATE", "NO_ZERO_DATE", "ERROR_FOR_DIVISION_BY_ZERO", "NO_AUTO_CREATE_USER", "NO_ENGINE_SUBSTITUTION"}, +} + +// FormatFunc is the locale format function signature. +type FormatFunc func(string, string) (string, error) + +// GetLocaleFormatFunction get the format function for sepcific locale. +func GetLocaleFormatFunction(loc string) FormatFunc { + locale, exist := locale2FormatFunction[loc] + if !exist { + return formatNotSupport + } + return locale +} + +// locale2FormatFunction is the string represent of locale format function. +var locale2FormatFunction = map[string]FormatFunc{ + "en_US": formatENUS, + "zh_CN": formatZHCN, +} + +// PriorityEnum is defined for Priority const values. +type PriorityEnum int + +// Priority const values. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +const ( + NoPriority PriorityEnum = iota + LowPriority + HighPriority + DelayedPriority +) + +// Priority2Str is used to convert the statement priority to string. +var Priority2Str = map[PriorityEnum]string{ + NoPriority: "NO_PRIORITY", + LowPriority: "LOW_PRIORITY", + HighPriority: "HIGH_PRIORITY", + DelayedPriority: "DELAYED", +} + +// Str2Priority is used to convert a string to a priority. +func Str2Priority(val string) PriorityEnum { + val = strings.ToUpper(val) + switch val { + case "NO_PRIORITY": + return NoPriority + case "HIGH_PRIORITY": + return HighPriority + case "LOW_PRIORITY": + return LowPriority + case "DELAYED": + return DelayedPriority + default: + return NoPriority + } +} + +// PrimaryKeyName defines primary key name. +const ( + PrimaryKeyName = "PRIMARY" +) diff --git a/mysql/const_test.go b/mysql/const_test.go new file mode 100644 index 000000000..4ad54fd5d --- /dev/null +++ b/mysql/const_test.go @@ -0,0 +1,321 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql_test + +import ( + "flag" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/mysql" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testleak" + "golang.org/x/net/context" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testMySQLConstSuite{}) + +type testMySQLConstSuite struct { + cluster *mocktikv.Cluster + mvccStore mocktikv.MVCCStore + store kv.Storage + dom *domain.Domain + *parser.Parser +} + +var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in executor test") + +func (s *testMySQLConstSuite) SetUpSuite(c *C) { + s.Parser = parser.New() + flag.Lookup("mockTikv") + useMockTikv := *mockTikv + if useMockTikv { + s.cluster = mocktikv.NewCluster() + mocktikv.BootstrapWithSingleStore(s.cluster) + s.mvccStore = mocktikv.MustNewMVCCStore() + store, err := mockstore.NewMockTikvStore( + mockstore.WithCluster(s.cluster), + mockstore.WithMVCCStore(s.mvccStore), + ) + c.Assert(err, IsNil) + s.store = store + session.SetSchemaLease(0) + session.SetStatsLease(0) + } + var err error + s.dom, err = session.BootstrapSession(s.store) + c.Assert(err, IsNil) +} + +func (s *testMySQLConstSuite) TearDownSuite(c *C) { + s.dom.Close() + s.store.Close() + testleak.AfterTest(c)() +} + +func (s *testMySQLConstSuite) TestGetSQLMode(c *C) { + positiveCases := []struct { + arg string + }{ + {"NO_ZERO_DATE"}, + {",,NO_ZERO_DATE"}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE"}, + {""}, + {", "}, + {","}, + } + + for _, t := range positiveCases { + _, err := mysql.GetSQLMode(mysql.FormatSQLModeStr(t.arg)) + c.Assert(err, IsNil) + } + + negativeCases := []struct { + arg string + }{ + {"NO_ZERO_DATE, NO_ZERO_IN_DATE"}, + {"NO_ZERO_DATE,adfadsdfasdfads"}, + {", ,NO_ZERO_DATE"}, + {" ,"}, + } + + for _, t := range negativeCases { + _, err := mysql.GetSQLMode(mysql.FormatSQLModeStr(t.arg)) + c.Assert(err, NotNil) + } +} + +func (s *testMySQLConstSuite) TestSQLMode(c *C) { + tests := []struct { + arg string + hasNoZeroDateMode bool + hasNoZeroInDateMode bool + hasErrorForDivisionByZeroMode bool + }{ + {"NO_ZERO_DATE", true, false, false}, + {"NO_ZERO_IN_DATE", false, true, false}, + {"ERROR_FOR_DIVISION_BY_ZERO", false, false, true}, + {"NO_ZERO_IN_DATE,NO_ZERO_DATE", true, true, false}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE", true, true, false}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE", true, true, false}, + {"NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO", true, true, true}, + {"NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO", false, true, true}, + {"", false, false, false}, + } + + for _, t := range tests { + sqlMode, _ := mysql.GetSQLMode(t.arg) + c.Assert(sqlMode.HasNoZeroDateMode(), Equals, t.hasNoZeroDateMode) + c.Assert(sqlMode.HasNoZeroInDateMode(), Equals, t.hasNoZeroInDateMode) + c.Assert(sqlMode.HasErrorForDivisionByZeroMode(), Equals, t.hasErrorForDivisionByZeroMode) + } +} + +func (s *testMySQLConstSuite) TestRealAsFloatMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a real);") + result := tk.MustQuery("desc t") + c.Check(result.Rows(), HasLen, 1) + row := result.Rows()[0] + c.Assert(row[1], Equals, "double") + + tk.MustExec("drop table if exists t;") + tk.MustExec("set sql_mode='REAL_AS_FLOAT'") + tk.MustExec("create table t (a real)") + result = tk.MustQuery("desc t") + c.Check(result.Rows(), HasLen, 1) + row = result.Rows()[0] + c.Assert(row[1], Equals, "float") +} + +func (s *testMySQLConstSuite) TestPipesAsConcatMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("SET sql_mode='PIPES_AS_CONCAT';") + r := tk.MustQuery(`SELECT 'hello' || 'world';`) + r.Check(testkit.Rows("helloworld")) +} + +func (s *testMySQLConstSuite) TestNoUnsignedSubtractionMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + ctx := context.Background() + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'") + r := tk.MustQuery("SELECT CAST(0 as UNSIGNED) - 1;") + r.Check(testkit.Rows("-1")) + rs, _ := tk.Exec("SELECT CAST(18446744073709551615 as UNSIGNED) - 1;") + _, err := session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) + rs, _ = tk.Exec("SELECT 1 - CAST(18446744073709551615 as UNSIGNED);") + _, err = session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) + rs, _ = tk.Exec("SELECT CAST(-1 as UNSIGNED) - 1") + _, err = session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) + rs, _ = tk.Exec("SELECT CAST(9223372036854775808 as UNSIGNED) - 1") + _, err = session.GetRows4Test(ctx, tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(rs.Close(), IsNil) +} + +func (s *testMySQLConstSuite) TestHighNotPrecedenceMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a int);") + tk.MustExec("insert into t1 values (0),(1),(NULL);") + r := tk.MustQuery(`SELECT * FROM t1 WHERE NOT a BETWEEN 2 AND 3;`) + r.Check(testkit.Rows("0", "1")) + r = tk.MustQuery(`SELECT NOT 1 BETWEEN -5 AND 5;`) + r.Check(testkit.Rows("0")) + tk.MustExec("set sql_mode='high_not_precedence';") + r = tk.MustQuery(`SELECT * FROM t1 WHERE NOT a BETWEEN 2 AND 3;`) + r.Check(testkit.Rows()) + r = tk.MustQuery(`SELECT NOT 1 BETWEEN -5 AND 5;`) + r.Check(testkit.Rows("1")) +} + +func (s *testMySQLConstSuite) TestIgnoreSpaceMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set sql_mode=''") + tk.MustExec("CREATE TABLE COUNT (a bigint);") + tk.MustExec("DROP TABLE COUNT;") + tk.MustExec("CREATE TABLE `COUNT` (a bigint);") + tk.MustExec("DROP TABLE COUNT;") + _, err := tk.Exec("CREATE TABLE COUNT(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.COUNT(a bigint);") + tk.MustExec("DROP TABLE COUNT;") + + tk.MustExec("CREATE TABLE BIT_AND (a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + tk.MustExec("CREATE TABLE `BIT_AND` (a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + _, err = tk.Exec("CREATE TABLE BIT_AND(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.BIT_AND(a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + + tk.MustExec("CREATE TABLE NOW (a bigint);") + tk.MustExec("DROP TABLE NOW;") + tk.MustExec("CREATE TABLE `NOW` (a bigint);") + tk.MustExec("DROP TABLE NOW;") + _, err = tk.Exec("CREATE TABLE NOW(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.NOW(a bigint);") + tk.MustExec("DROP TABLE NOW;") + + tk.MustExec("set sql_mode='IGNORE_SPACE'") + _, err = tk.Exec("CREATE TABLE COUNT (a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE `COUNT` (a bigint);") + tk.MustExec("DROP TABLE COUNT;") + _, err = tk.Exec("CREATE TABLE COUNT(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.COUNT(a bigint);") + tk.MustExec("DROP TABLE COUNT;") + + _, err = tk.Exec("CREATE TABLE BIT_AND (a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE `BIT_AND` (a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + _, err = tk.Exec("CREATE TABLE BIT_AND(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.BIT_AND(a bigint);") + tk.MustExec("DROP TABLE BIT_AND;") + + _, err = tk.Exec("CREATE TABLE NOW (a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE `NOW` (a bigint);") + tk.MustExec("DROP TABLE NOW;") + _, err = tk.Exec("CREATE TABLE NOW(a bigint);") + c.Assert(err, NotNil) + tk.MustExec("CREATE TABLE test.NOW(a bigint);") + tk.MustExec("DROP TABLE NOW;") + +} + +func (s *testMySQLConstSuite) TestPadCharToFullLengthMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // test type `CHAR(n)` + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a char(10));") + tk.MustExec("insert into t1 values ('xy');") + tk.MustExec("set sql_mode='';") + r := tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("0 2")) + r = tk.MustQuery(`SELECT count(*) FROM t1 WHERE a='xy ';`) + r.Check(testkit.Rows("0")) + tk.MustExec("set sql_mode='PAD_CHAR_TO_FULL_LENGTH';") + r = tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("1 10")) + r = tk.MustQuery(`SELECT count(*) FROM t1 WHERE a='xy ';`) + r.Check(testkit.Rows("1")) + + // test type `VARCHAR(n)` + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a varchar(10));") + tk.MustExec("insert into t1 values ('xy');") + tk.MustExec("set sql_mode='';") + r = tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("0 2")) + r = tk.MustQuery(`SELECT count(*) FROM t1 WHERE a='xy ';`) + r.Check(testkit.Rows("0")) + tk.MustExec("set sql_mode='PAD_CHAR_TO_FULL_LENGTH';") + r = tk.MustQuery(`SELECT a='xy ', char_length(a) FROM t1;`) + r.Check(testkit.Rows("0 2")) +} + +func (s *testMySQLConstSuite) TestNoBackslashEscapesMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode=''") + r := tk.MustQuery("SELECT '\\\\'") + r.Check(testkit.Rows("\\")) + tk.MustExec("set sql_mode='NO_BACKSLASH_ESCAPES'") + r = tk.MustQuery("SELECT '\\\\'") + r.Check(testkit.Rows("\\\\")) +} + +func (s *testMySQLConstSuite) TestServerStatus(c *C) { + tests := []struct { + arg uint16 + IsCursorExists bool + }{ + {0, false}, + {mysql.ServerStatusInTrans | mysql.ServerStatusNoBackslashEscaped, false}, + {mysql.ServerStatusCursorExists, true}, + {mysql.ServerStatusCursorExists | mysql.ServerStatusLastRowSend, true}, + } + + for _, t := range tests { + ret := mysql.HasCursorExistsFlag(t.arg) + c.Assert(ret, Equals, t.IsCursorExists) + } +} diff --git a/mysql/errcode.go b/mysql/errcode.go new file mode 100644 index 000000000..79c699949 --- /dev/null +++ b/mysql/errcode.go @@ -0,0 +1,910 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL error code. +// This value is numeric. It is not portable to other database systems. +const ( + ErrErrorFirst uint16 = 1000 + ErrHashchk = 1000 + ErrNisamchk = 1001 + ErrNo = 1002 + ErrYes = 1003 + ErrCantCreateFile = 1004 + ErrCantCreateTable = 1005 + ErrCantCreateDB = 1006 + ErrDBCreateExists = 1007 + ErrDBDropExists = 1008 + ErrDBDropDelete = 1009 + ErrDBDropRmdir = 1010 + ErrCantDeleteFile = 1011 + ErrCantFindSystemRec = 1012 + ErrCantGetStat = 1013 + ErrCantGetWd = 1014 + ErrCantLock = 1015 + ErrCantOpenFile = 1016 + ErrFileNotFound = 1017 + ErrCantReadDir = 1018 + ErrCantSetWd = 1019 + ErrCheckread = 1020 + ErrDiskFull = 1021 + ErrDupKey = 1022 + ErrErrorOnClose = 1023 + ErrErrorOnRead = 1024 + ErrErrorOnRename = 1025 + ErrErrorOnWrite = 1026 + ErrFileUsed = 1027 + ErrFilsortAbort = 1028 + ErrFormNotFound = 1029 + ErrGetErrno = 1030 + ErrIllegalHa = 1031 + ErrKeyNotFound = 1032 + ErrNotFormFile = 1033 + ErrNotKeyFile = 1034 + ErrOldKeyFile = 1035 + ErrOpenAsReadonly = 1036 + ErrOutofMemory = 1037 + ErrOutOfSortMemory = 1038 + ErrUnexpectedEOF = 1039 + ErrConCount = 1040 + ErrOutOfResources = 1041 + ErrBadHost = 1042 + ErrHandshake = 1043 + ErrDBaccessDenied = 1044 + ErrAccessDenied = 1045 + ErrNoDB = 1046 + ErrUnknownCom = 1047 + ErrBadNull = 1048 + ErrBadDB = 1049 + ErrTableExists = 1050 + ErrBadTable = 1051 + ErrNonUniq = 1052 + ErrServerShutdown = 1053 + ErrBadField = 1054 + ErrFieldNotInGroupBy = 1055 + ErrWrongGroupField = 1056 + ErrWrongSumSelect = 1057 + ErrWrongValueCount = 1058 + ErrTooLongIdent = 1059 + ErrDupFieldName = 1060 + ErrDupKeyName = 1061 + ErrDupEntry = 1062 + ErrWrongFieldSpec = 1063 + ErrParse = 1064 + ErrEmptyQuery = 1065 + ErrNonuniqTable = 1066 + ErrInvalidDefault = 1067 + ErrMultiplePriKey = 1068 + ErrTooManyKeys = 1069 + ErrTooManyKeyParts = 1070 + ErrTooLongKey = 1071 + ErrKeyColumnDoesNotExits = 1072 + ErrBlobUsedAsKey = 1073 + ErrTooBigFieldlength = 1074 + ErrWrongAutoKey = 1075 + ErrReady = 1076 + ErrNormalShutdown = 1077 + ErrGotSignal = 1078 + ErrShutdownComplete = 1079 + ErrForcingClose = 1080 + ErrIpsock = 1081 + ErrNoSuchIndex = 1082 + ErrWrongFieldTerminators = 1083 + ErrBlobsAndNoTerminated = 1084 + ErrTextFileNotReadable = 1085 + ErrFileExists = 1086 + ErrLoadInfo = 1087 + ErrAlterInfo = 1088 + ErrWrongSubKey = 1089 + ErrCantRemoveAllFields = 1090 + ErrCantDropFieldOrKey = 1091 + ErrInsertInfo = 1092 + ErrUpdateTableUsed = 1093 + ErrNoSuchThread = 1094 + ErrKillDenied = 1095 + ErrNoTablesUsed = 1096 + ErrTooBigSet = 1097 + ErrNoUniqueLogFile = 1098 + ErrTableNotLockedForWrite = 1099 + ErrTableNotLocked = 1100 + ErrBlobCantHaveDefault = 1101 + ErrWrongDBName = 1102 + ErrWrongTableName = 1103 + ErrTooBigSelect = 1104 + ErrUnknown = 1105 + ErrUnknownProcedure = 1106 + ErrWrongParamcountToProcedure = 1107 + ErrWrongParametersToProcedure = 1108 + ErrUnknownTable = 1109 + ErrFieldSpecifiedTwice = 1110 + ErrInvalidGroupFuncUse = 1111 + ErrUnsupportedExtension = 1112 + ErrTableMustHaveColumns = 1113 + ErrRecordFileFull = 1114 + ErrUnknownCharacterSet = 1115 + ErrTooManyTables = 1116 + ErrTooManyFields = 1117 + ErrTooBigRowsize = 1118 + ErrStackOverrun = 1119 + ErrWrongOuterJoin = 1120 + ErrNullColumnInIndex = 1121 + ErrCantFindUdf = 1122 + ErrCantInitializeUdf = 1123 + ErrUdfNoPaths = 1124 + ErrUdfExists = 1125 + ErrCantOpenLibrary = 1126 + ErrCantFindDlEntry = 1127 + ErrFunctionNotDefined = 1128 + ErrHostIsBlocked = 1129 + ErrHostNotPrivileged = 1130 + ErrPasswordAnonymousUser = 1131 + ErrPasswordNotAllowed = 1132 + ErrPasswordNoMatch = 1133 + ErrUpdateInfo = 1134 + ErrCantCreateThread = 1135 + ErrWrongValueCountOnRow = 1136 + ErrCantReopenTable = 1137 + ErrInvalidUseOfNull = 1138 + ErrRegexp = 1139 + ErrMixOfGroupFuncAndFields = 1140 + ErrNonexistingGrant = 1141 + ErrTableaccessDenied = 1142 + ErrColumnaccessDenied = 1143 + ErrIllegalGrantForTable = 1144 + ErrGrantWrongHostOrUser = 1145 + ErrNoSuchTable = 1146 + ErrNonexistingTableGrant = 1147 + ErrNotAllowedCommand = 1148 + ErrSyntax = 1149 + ErrDelayedCantChangeLock = 1150 + ErrTooManyDelayedThreads = 1151 + ErrAbortingConnection = 1152 + ErrNetPacketTooLarge = 1153 + ErrNetReadErrorFromPipe = 1154 + ErrNetFcntl = 1155 + ErrNetPacketsOutOfOrder = 1156 + ErrNetUncompress = 1157 + ErrNetRead = 1158 + ErrNetReadInterrupted = 1159 + ErrNetErrorOnWrite = 1160 + ErrNetWriteInterrupted = 1161 + ErrTooLongString = 1162 + ErrTableCantHandleBlob = 1163 + ErrTableCantHandleAutoIncrement = 1164 + ErrDelayedInsertTableLocked = 1165 + ErrWrongColumnName = 1166 + ErrWrongKeyColumn = 1167 + ErrWrongMrgTable = 1168 + ErrDupUnique = 1169 + ErrBlobKeyWithoutLength = 1170 + ErrPrimaryCantHaveNull = 1171 + ErrTooManyRows = 1172 + ErrRequiresPrimaryKey = 1173 + ErrNoRaidCompiled = 1174 + ErrUpdateWithoutKeyInSafeMode = 1175 + ErrKeyDoesNotExist = 1176 + ErrCheckNoSuchTable = 1177 + ErrCheckNotImplemented = 1178 + ErrCantDoThisDuringAnTransaction = 1179 + ErrErrorDuringCommit = 1180 + ErrErrorDuringRollback = 1181 + ErrErrorDuringFlushLogs = 1182 + ErrErrorDuringCheckpoint = 1183 + ErrNewAbortingConnection = 1184 + ErrDumpNotImplemented = 1185 + ErrFlushMasterBinlogClosed = 1186 + ErrIndexRebuild = 1187 + ErrMaster = 1188 + ErrMasterNetRead = 1189 + ErrMasterNetWrite = 1190 + ErrFtMatchingKeyNotFound = 1191 + ErrLockOrActiveTransaction = 1192 + ErrUnknownSystemVariable = 1193 + ErrCrashedOnUsage = 1194 + ErrCrashedOnRepair = 1195 + ErrWarningNotCompleteRollback = 1196 + ErrTransCacheFull = 1197 + ErrSlaveMustStop = 1198 + ErrSlaveNotRunning = 1199 + ErrBadSlave = 1200 + ErrMasterInfo = 1201 + ErrSlaveThread = 1202 + ErrTooManyUserConnections = 1203 + ErrSetConstantsOnly = 1204 + ErrLockWaitTimeout = 1205 + ErrLockTableFull = 1206 + ErrReadOnlyTransaction = 1207 + ErrDropDBWithReadLock = 1208 + ErrCreateDBWithReadLock = 1209 + ErrWrongArguments = 1210 + ErrNoPermissionToCreateUser = 1211 + ErrUnionTablesInDifferentDir = 1212 + ErrLockDeadlock = 1213 + ErrTableCantHandleFt = 1214 + ErrCannotAddForeign = 1215 + ErrNoReferencedRow = 1216 + ErrRowIsReferenced = 1217 + ErrConnectToMaster = 1218 + ErrQueryOnMaster = 1219 + ErrErrorWhenExecutingCommand = 1220 + ErrWrongUsage = 1221 + ErrWrongNumberOfColumnsInSelect = 1222 + ErrCantUpdateWithReadlock = 1223 + ErrMixingNotAllowed = 1224 + ErrDupArgument = 1225 + ErrUserLimitReached = 1226 + ErrSpecificAccessDenied = 1227 + ErrLocalVariable = 1228 + ErrGlobalVariable = 1229 + ErrNoDefault = 1230 + ErrWrongValueForVar = 1231 + ErrWrongTypeForVar = 1232 + ErrVarCantBeRead = 1233 + ErrCantUseOptionHere = 1234 + ErrNotSupportedYet = 1235 + ErrMasterFatalErrorReadingBinlog = 1236 + ErrSlaveIgnoredTable = 1237 + ErrIncorrectGlobalLocalVar = 1238 + ErrWrongFkDef = 1239 + ErrKeyRefDoNotMatchTableRef = 1240 + ErrOperandColumns = 1241 + ErrSubqueryNo1Row = 1242 + ErrUnknownStmtHandler = 1243 + ErrCorruptHelpDB = 1244 + ErrCyclicReference = 1245 + ErrAutoConvert = 1246 + ErrIllegalReference = 1247 + ErrDerivedMustHaveAlias = 1248 + ErrSelectReduced = 1249 + ErrTablenameNotAllowedHere = 1250 + ErrNotSupportedAuthMode = 1251 + ErrSpatialCantHaveNull = 1252 + ErrCollationCharsetMismatch = 1253 + ErrSlaveWasRunning = 1254 + ErrSlaveWasNotRunning = 1255 + ErrTooBigForUncompress = 1256 + ErrZlibZMem = 1257 + ErrZlibZBuf = 1258 + ErrZlibZData = 1259 + ErrCutValueGroupConcat = 1260 + ErrWarnTooFewRecords = 1261 + ErrWarnTooManyRecords = 1262 + ErrWarnNullToNotnull = 1263 + ErrWarnDataOutOfRange = 1264 + WarnDataTruncated = 1265 + ErrWarnUsingOtherHandler = 1266 + ErrCantAggregate2collations = 1267 + ErrDropUser = 1268 + ErrRevokeGrants = 1269 + ErrCantAggregate3collations = 1270 + ErrCantAggregateNcollations = 1271 + ErrVariableIsNotStruct = 1272 + ErrUnknownCollation = 1273 + ErrSlaveIgnoredSslParams = 1274 + ErrServerIsInSecureAuthMode = 1275 + ErrWarnFieldResolved = 1276 + ErrBadSlaveUntilCond = 1277 + ErrMissingSkipSlave = 1278 + ErrUntilCondIgnored = 1279 + ErrWrongNameForIndex = 1280 + ErrWrongNameForCatalog = 1281 + ErrWarnQcResize = 1282 + ErrBadFtColumn = 1283 + ErrUnknownKeyCache = 1284 + ErrWarnHostnameWontWork = 1285 + ErrUnknownStorageEngine = 1286 + ErrWarnDeprecatedSyntax = 1287 + ErrNonUpdatableTable = 1288 + ErrFeatureDisabled = 1289 + ErrOptionPreventsStatement = 1290 + ErrDuplicatedValueInType = 1291 + ErrTruncatedWrongValue = 1292 + ErrTooMuchAutoTimestampCols = 1293 + ErrInvalidOnUpdate = 1294 + ErrUnsupportedPs = 1295 + ErrGetErrmsg = 1296 + ErrGetTemporaryErrmsg = 1297 + ErrUnknownTimeZone = 1298 + ErrWarnInvalidTimestamp = 1299 + ErrInvalidCharacterString = 1300 + ErrWarnAllowedPacketOverflowed = 1301 + ErrConflictingDeclarations = 1302 + ErrSpNoRecursiveCreate = 1303 + ErrSpAlreadyExists = 1304 + ErrSpDoesNotExist = 1305 + ErrSpDropFailed = 1306 + ErrSpStoreFailed = 1307 + ErrSpLilabelMismatch = 1308 + ErrSpLabelRedefine = 1309 + ErrSpLabelMismatch = 1310 + ErrSpUninitVar = 1311 + ErrSpBadselect = 1312 + ErrSpBadreturn = 1313 + ErrSpBadstatement = 1314 + ErrUpdateLogDeprecatedIgnored = 1315 + ErrUpdateLogDeprecatedTranslated = 1316 + ErrQueryInterrupted = 1317 + ErrSpWrongNoOfArgs = 1318 + ErrSpCondMismatch = 1319 + ErrSpNoreturn = 1320 + ErrSpNoreturnend = 1321 + ErrSpBadCursorQuery = 1322 + ErrSpBadCursorSelect = 1323 + ErrSpCursorMismatch = 1324 + ErrSpCursorAlreadyOpen = 1325 + ErrSpCursorNotOpen = 1326 + ErrSpUndeclaredVar = 1327 + ErrSpWrongNoOfFetchArgs = 1328 + ErrSpFetchNoData = 1329 + ErrSpDupParam = 1330 + ErrSpDupVar = 1331 + ErrSpDupCond = 1332 + ErrSpDupCurs = 1333 + ErrSpCantAlter = 1334 + ErrSpSubselectNyi = 1335 + ErrStmtNotAllowedInSfOrTrg = 1336 + ErrSpVarcondAfterCurshndlr = 1337 + ErrSpCursorAfterHandler = 1338 + ErrSpCaseNotFound = 1339 + ErrFparserTooBigFile = 1340 + ErrFparserBadHeader = 1341 + ErrFparserEOFInComment = 1342 + ErrFparserErrorInParameter = 1343 + ErrFparserEOFInUnknownParameter = 1344 + ErrViewNoExplain = 1345 + ErrFrmUnknownType = 1346 + ErrWrongObject = 1347 + ErrNonupdateableColumn = 1348 + ErrViewSelectDerived = 1349 + ErrViewSelectClause = 1350 + ErrViewSelectVariable = 1351 + ErrViewSelectTmptable = 1352 + ErrViewWrongList = 1353 + ErrWarnViewMerge = 1354 + ErrWarnViewWithoutKey = 1355 + ErrViewInvalid = 1356 + ErrSpNoDropSp = 1357 + ErrSpGotoInHndlr = 1358 + ErrTrgAlreadyExists = 1359 + ErrTrgDoesNotExist = 1360 + ErrTrgOnViewOrTempTable = 1361 + ErrTrgCantChangeRow = 1362 + ErrTrgNoSuchRowInTrg = 1363 + ErrNoDefaultForField = 1364 + ErrDivisionByZero = 1365 + ErrTruncatedWrongValueForField = 1366 + ErrIllegalValueForType = 1367 + ErrViewNonupdCheck = 1368 + ErrViewCheckFailed = 1369 + ErrProcaccessDenied = 1370 + ErrRelayLogFail = 1371 + ErrPasswdLength = 1372 + ErrUnknownTargetBinlog = 1373 + ErrIoErrLogIndexRead = 1374 + ErrBinlogPurgeProhibited = 1375 + ErrFseekFail = 1376 + ErrBinlogPurgeFatalErr = 1377 + ErrLogInUse = 1378 + ErrLogPurgeUnknownErr = 1379 + ErrRelayLogInit = 1380 + ErrNoBinaryLogging = 1381 + ErrReservedSyntax = 1382 + ErrWsasFailed = 1383 + ErrDiffGroupsProc = 1384 + ErrNoGroupForProc = 1385 + ErrOrderWithProc = 1386 + ErrLoggingProhibitChangingOf = 1387 + ErrNoFileMapping = 1388 + ErrWrongMagic = 1389 + ErrPsManyParam = 1390 + ErrKeyPart0 = 1391 + ErrViewChecksum = 1392 + ErrViewMultiupdate = 1393 + ErrViewNoInsertFieldList = 1394 + ErrViewDeleteMergeView = 1395 + ErrCannotUser = 1396 + ErrXaerNota = 1397 + ErrXaerInval = 1398 + ErrXaerRmfail = 1399 + ErrXaerOutside = 1400 + ErrXaerRmerr = 1401 + ErrXaRbrollback = 1402 + ErrNonexistingProcGrant = 1403 + ErrProcAutoGrantFail = 1404 + ErrProcAutoRevokeFail = 1405 + ErrDataTooLong = 1406 + ErrSpBadSQLstate = 1407 + ErrStartup = 1408 + ErrLoadFromFixedSizeRowsToVar = 1409 + ErrCantCreateUserWithGrant = 1410 + ErrWrongValueForType = 1411 + ErrTableDefChanged = 1412 + ErrSpDupHandler = 1413 + ErrSpNotVarArg = 1414 + ErrSpNoRetset = 1415 + ErrCantCreateGeometryObject = 1416 + ErrFailedRoutineBreakBinlog = 1417 + ErrBinlogUnsafeRoutine = 1418 + ErrBinlogCreateRoutineNeedSuper = 1419 + ErrExecStmtWithOpenCursor = 1420 + ErrStmtHasNoOpenCursor = 1421 + ErrCommitNotAllowedInSfOrTrg = 1422 + ErrNoDefaultForViewField = 1423 + ErrSpNoRecursion = 1424 + ErrTooBigScale = 1425 + ErrTooBigPrecision = 1426 + ErrMBiggerThanD = 1427 + ErrWrongLockOfSystemTable = 1428 + ErrConnectToForeignDataSource = 1429 + ErrQueryOnForeignDataSource = 1430 + ErrForeignDataSourceDoesntExist = 1431 + ErrForeignDataStringInvalidCantCreate = 1432 + ErrForeignDataStringInvalid = 1433 + ErrCantCreateFederatedTable = 1434 + ErrTrgInWrongSchema = 1435 + ErrStackOverrunNeedMore = 1436 + ErrTooLongBody = 1437 + ErrWarnCantDropDefaultKeycache = 1438 + ErrTooBigDisplaywidth = 1439 + ErrXaerDupid = 1440 + ErrDatetimeFunctionOverflow = 1441 + ErrCantUpdateUsedTableInSfOrTrg = 1442 + ErrViewPreventUpdate = 1443 + ErrPsNoRecursion = 1444 + ErrSpCantSetAutocommit = 1445 + ErrMalformedDefiner = 1446 + ErrViewFrmNoUser = 1447 + ErrViewOtherUser = 1448 + ErrNoSuchUser = 1449 + ErrForbidSchemaChange = 1450 + ErrRowIsReferenced2 = 1451 + ErrNoReferencedRow2 = 1452 + ErrSpBadVarShadow = 1453 + ErrTrgNoDefiner = 1454 + ErrOldFileFormat = 1455 + ErrSpRecursionLimit = 1456 + ErrSpProcTableCorrupt = 1457 + ErrSpWrongName = 1458 + ErrTableNeedsUpgrade = 1459 + ErrSpNoAggregate = 1460 + ErrMaxPreparedStmtCountReached = 1461 + ErrViewRecursive = 1462 + ErrNonGroupingFieldUsed = 1463 + ErrTableCantHandleSpkeys = 1464 + ErrNoTriggersOnSystemSchema = 1465 + ErrRemovedSpaces = 1466 + ErrAutoincReadFailed = 1467 + ErrUsername = 1468 + ErrHostname = 1469 + ErrWrongStringLength = 1470 + ErrNonInsertableTable = 1471 + ErrAdminWrongMrgTable = 1472 + ErrTooHighLevelOfNestingForSelect = 1473 + ErrNameBecomesEmpty = 1474 + ErrAmbiguousFieldTerm = 1475 + ErrForeignServerExists = 1476 + ErrForeignServerDoesntExist = 1477 + ErrIllegalHaCreateOption = 1478 + ErrPartitionRequiresValues = 1479 + ErrPartitionWrongValues = 1480 + ErrPartitionMaxvalue = 1481 + ErrPartitionSubpartition = 1482 + ErrPartitionSubpartMix = 1483 + ErrPartitionWrongNoPart = 1484 + ErrPartitionWrongNoSubpart = 1485 + ErrWrongExprInPartitionFunc = 1486 + ErrNoConstExprInRangeOrList = 1487 + ErrFieldNotFoundPart = 1488 + ErrListOfFieldsOnlyInHash = 1489 + ErrInconsistentPartitionInfo = 1490 + ErrPartitionFuncNotAllowed = 1491 + ErrPartitionsMustBeDefined = 1492 + ErrRangeNotIncreasing = 1493 + ErrInconsistentTypeOfFunctions = 1494 + ErrMultipleDefConstInListPart = 1495 + ErrPartitionEntry = 1496 + ErrMixHandler = 1497 + ErrPartitionNotDefined = 1498 + ErrTooManyPartitions = 1499 + ErrSubpartition = 1500 + ErrCantCreateHandlerFile = 1501 + ErrBlobFieldInPartFunc = 1502 + ErrUniqueKeyNeedAllFieldsInPf = 1503 + ErrNoParts = 1504 + ErrPartitionMgmtOnNonpartitioned = 1505 + ErrForeignKeyOnPartitioned = 1506 + ErrDropPartitionNonExistent = 1507 + ErrDropLastPartition = 1508 + ErrCoalesceOnlyOnHashPartition = 1509 + ErrReorgHashOnlyOnSameNo = 1510 + ErrReorgNoParam = 1511 + ErrOnlyOnRangeListPartition = 1512 + ErrAddPartitionSubpart = 1513 + ErrAddPartitionNoNewPartition = 1514 + ErrCoalescePartitionNoPartition = 1515 + ErrReorgPartitionNotExist = 1516 + ErrSameNamePartition = 1517 + ErrNoBinlog = 1518 + ErrConsecutiveReorgPartitions = 1519 + ErrReorgOutsideRange = 1520 + ErrPartitionFunctionFailure = 1521 + ErrPartState = 1522 + ErrLimitedPartRange = 1523 + ErrPluginIsNotLoaded = 1524 + ErrWrongValue = 1525 + ErrNoPartitionForGivenValue = 1526 + ErrFilegroupOptionOnlyOnce = 1527 + ErrCreateFilegroupFailed = 1528 + ErrDropFilegroupFailed = 1529 + ErrTablespaceAutoExtend = 1530 + ErrWrongSizeNumber = 1531 + ErrSizeOverflow = 1532 + ErrAlterFilegroupFailed = 1533 + ErrBinlogRowLoggingFailed = 1534 + ErrBinlogRowWrongTableDef = 1535 + ErrBinlogRowRbrToSbr = 1536 + ErrEventAlreadyExists = 1537 + ErrEventStoreFailed = 1538 + ErrEventDoesNotExist = 1539 + ErrEventCantAlter = 1540 + ErrEventDropFailed = 1541 + ErrEventIntervalNotPositiveOrTooBig = 1542 + ErrEventEndsBeforeStarts = 1543 + ErrEventExecTimeInThePast = 1544 + ErrEventOpenTableFailed = 1545 + ErrEventNeitherMExprNorMAt = 1546 + ErrObsoleteColCountDoesntMatchCorrupted = 1547 + ErrObsoleteCannotLoadFromTable = 1548 + ErrEventCannotDelete = 1549 + ErrEventCompile = 1550 + ErrEventSameName = 1551 + ErrEventDataTooLong = 1552 + ErrDropIndexFk = 1553 + ErrWarnDeprecatedSyntaxWithVer = 1554 + ErrCantWriteLockLogTable = 1555 + ErrCantLockLogTable = 1556 + ErrForeignDuplicateKeyOldUnused = 1557 + ErrColCountDoesntMatchPleaseUpdate = 1558 + ErrTempTablePreventsSwitchOutOfRbr = 1559 + ErrStoredFunctionPreventsSwitchBinlogFormat = 1560 + ErrNdbCantSwitchBinlogFormat = 1561 + ErrPartitionNoTemporary = 1562 + ErrPartitionConstDomain = 1563 + ErrPartitionFunctionIsNotAllowed = 1564 + ErrDdlLog = 1565 + ErrNullInValuesLessThan = 1566 + ErrWrongPartitionName = 1567 + ErrCantChangeTxCharacteristics = 1568 + ErrDupEntryAutoincrementCase = 1569 + ErrEventModifyQueue = 1570 + ErrEventSetVar = 1571 + ErrPartitionMerge = 1572 + ErrCantActivateLog = 1573 + ErrRbrNotAvailable = 1574 + ErrBase64Decode = 1575 + ErrEventRecursionForbidden = 1576 + ErrEventsDB = 1577 + ErrOnlyIntegersAllowed = 1578 + ErrUnsuportedLogEngine = 1579 + ErrBadLogStatement = 1580 + ErrCantRenameLogTable = 1581 + ErrWrongParamcountToNativeFct = 1582 + ErrWrongParametersToNativeFct = 1583 + ErrWrongParametersToStoredFct = 1584 + ErrNativeFctNameCollision = 1585 + ErrDupEntryWithKeyName = 1586 + ErrBinlogPurgeEmFile = 1587 + ErrEventCannotCreateInThePast = 1588 + ErrEventCannotAlterInThePast = 1589 + ErrSlaveIncident = 1590 + ErrNoPartitionForGivenValueSilent = 1591 + ErrBinlogUnsafeStatement = 1592 + ErrSlaveFatal = 1593 + ErrSlaveRelayLogReadFailure = 1594 + ErrSlaveRelayLogWriteFailure = 1595 + ErrSlaveCreateEventFailure = 1596 + ErrSlaveMasterComFailure = 1597 + ErrBinlogLoggingImpossible = 1598 + ErrViewNoCreationCtx = 1599 + ErrViewInvalidCreationCtx = 1600 + ErrSrInvalidCreationCtx = 1601 + ErrTrgCorruptedFile = 1602 + ErrTrgNoCreationCtx = 1603 + ErrTrgInvalidCreationCtx = 1604 + ErrEventInvalidCreationCtx = 1605 + ErrTrgCantOpenTable = 1606 + ErrCantCreateSroutine = 1607 + ErrNeverUsed = 1608 + ErrNoFormatDescriptionEventBeforeBinlogStatement = 1609 + ErrSlaveCorruptEvent = 1610 + ErrLoadDataInvalidColumn = 1611 + ErrLogPurgeNoFile = 1612 + ErrXaRbtimeout = 1613 + ErrXaRbdeadlock = 1614 + ErrNeedReprepare = 1615 + ErrDelayedNotSupported = 1616 + WarnNoMasterInfo = 1617 + WarnOptionIgnored = 1618 + WarnPluginDeleteBuiltin = 1619 + WarnPluginBusy = 1620 + ErrVariableIsReadonly = 1621 + ErrWarnEngineTransactionRollback = 1622 + ErrSlaveHeartbeatFailure = 1623 + ErrSlaveHeartbeatValueOutOfRange = 1624 + ErrNdbReplicationSchema = 1625 + ErrConflictFnParse = 1626 + ErrExceptionsWrite = 1627 + ErrTooLongTableComment = 1628 + ErrTooLongFieldComment = 1629 + ErrFuncInexistentNameCollision = 1630 + ErrDatabaseName = 1631 + ErrTableName = 1632 + ErrPartitionName = 1633 + ErrSubpartitionName = 1634 + ErrTemporaryName = 1635 + ErrRenamedName = 1636 + ErrTooManyConcurrentTrxs = 1637 + WarnNonASCIISeparatorNotImplemented = 1638 + ErrDebugSyncTimeout = 1639 + ErrDebugSyncHitLimit = 1640 + ErrDupSignalSet = 1641 + ErrSignalWarn = 1642 + ErrSignalNotFound = 1643 + ErrSignalException = 1644 + ErrResignalWithoutActiveHandler = 1645 + ErrSignalBadConditionType = 1646 + WarnCondItemTruncated = 1647 + ErrCondItemTooLong = 1648 + ErrUnknownLocale = 1649 + ErrSlaveIgnoreServerIds = 1650 + ErrQueryCacheDisabled = 1651 + ErrSameNamePartitionField = 1652 + ErrPartitionColumnList = 1653 + ErrWrongTypeColumnValue = 1654 + ErrTooManyPartitionFuncFields = 1655 + ErrMaxvalueInValuesIn = 1656 + ErrTooManyValues = 1657 + ErrRowSinglePartitionField = 1658 + ErrFieldTypeNotAllowedAsPartitionField = 1659 + ErrPartitionFieldsTooLong = 1660 + ErrBinlogRowEngineAndStmtEngine = 1661 + ErrBinlogRowModeAndStmtEngine = 1662 + ErrBinlogUnsafeAndStmtEngine = 1663 + ErrBinlogRowInjectionAndStmtEngine = 1664 + ErrBinlogStmtModeAndRowEngine = 1665 + ErrBinlogRowInjectionAndStmtMode = 1666 + ErrBinlogMultipleEnginesAndSelfLoggingEngine = 1667 + ErrBinlogUnsafeLimit = 1668 + ErrBinlogUnsafeInsertDelayed = 1669 + ErrBinlogUnsafeSystemTable = 1670 + ErrBinlogUnsafeAutoincColumns = 1671 + ErrBinlogUnsafeUdf = 1672 + ErrBinlogUnsafeSystemVariable = 1673 + ErrBinlogUnsafeSystemFunction = 1674 + ErrBinlogUnsafeNontransAfterTrans = 1675 + ErrMessageAndStatement = 1676 + ErrSlaveConversionFailed = 1677 + ErrSlaveCantCreateConversion = 1678 + ErrInsideTransactionPreventsSwitchBinlogFormat = 1679 + ErrPathLength = 1680 + ErrWarnDeprecatedSyntaxNoReplacement = 1681 + ErrWrongNativeTableStructure = 1682 + ErrWrongPerfSchemaUsage = 1683 + ErrWarnISSkippedTable = 1684 + ErrInsideTransactionPreventsSwitchBinlogDirect = 1685 + ErrStoredFunctionPreventsSwitchBinlogDirect = 1686 + ErrSpatialMustHaveGeomCol = 1687 + ErrTooLongIndexComment = 1688 + ErrLockAborted = 1689 + ErrDataOutOfRange = 1690 + ErrWrongSpvarTypeInLimit = 1691 + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine = 1692 + ErrBinlogUnsafeMixedStatement = 1693 + ErrInsideTransactionPreventsSwitchSQLLogBin = 1694 + ErrStoredFunctionPreventsSwitchSQLLogBin = 1695 + ErrFailedReadFromParFile = 1696 + ErrValuesIsNotIntType = 1697 + ErrAccessDeniedNoPassword = 1698 + ErrSetPasswordAuthPlugin = 1699 + ErrGrantPluginUserExists = 1700 + ErrTruncateIllegalFk = 1701 + ErrPluginIsPermanent = 1702 + ErrSlaveHeartbeatValueOutOfRangeMin = 1703 + ErrSlaveHeartbeatValueOutOfRangeMax = 1704 + ErrStmtCacheFull = 1705 + ErrMultiUpdateKeyConflict = 1706 + ErrTableNeedsRebuild = 1707 + WarnOptionBelowLimit = 1708 + ErrIndexColumnTooLong = 1709 + ErrErrorInTriggerBody = 1710 + ErrErrorInUnknownTriggerBody = 1711 + ErrIndexCorrupt = 1712 + ErrUndoRecordTooBig = 1713 + ErrBinlogUnsafeInsertIgnoreSelect = 1714 + ErrBinlogUnsafeInsertSelectUpdate = 1715 + ErrBinlogUnsafeReplaceSelect = 1716 + ErrBinlogUnsafeCreateIgnoreSelect = 1717 + ErrBinlogUnsafeCreateReplaceSelect = 1718 + ErrBinlogUnsafeUpdateIgnore = 1719 + ErrPluginNoUninstall = 1720 + ErrPluginNoInstall = 1721 + ErrBinlogUnsafeWriteAutoincSelect = 1722 + ErrBinlogUnsafeCreateSelectAutoinc = 1723 + ErrBinlogUnsafeInsertTwoKeys = 1724 + ErrTableInFkCheck = 1725 + ErrUnsupportedEngine = 1726 + ErrBinlogUnsafeAutoincNotFirst = 1727 + ErrCannotLoadFromTableV2 = 1728 + ErrMasterDelayValueOutOfRange = 1729 + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement = 1730 + ErrPartitionExchangeDifferentOption = 1731 + ErrPartitionExchangePartTable = 1732 + ErrPartitionExchangeTempTable = 1733 + ErrPartitionInsteadOfSubpartition = 1734 + ErrUnknownPartition = 1735 + ErrTablesDifferentMetadata = 1736 + ErrRowDoesNotMatchPartition = 1737 + ErrBinlogCacheSizeGreaterThanMax = 1738 + ErrWarnIndexNotApplicable = 1739 + ErrPartitionExchangeForeignKey = 1740 + ErrNoSuchKeyValue = 1741 + ErrRplInfoDataTooLong = 1742 + ErrNetworkReadEventChecksumFailure = 1743 + ErrBinlogReadEventChecksumFailure = 1744 + ErrBinlogStmtCacheSizeGreaterThanMax = 1745 + ErrCantUpdateTableInCreateTableSelect = 1746 + ErrPartitionClauseOnNonpartitioned = 1747 + ErrRowDoesNotMatchGivenPartitionSet = 1748 + ErrNoSuchPartitionunused = 1749 + ErrChangeRplInfoRepositoryFailure = 1750 + ErrWarningNotCompleteRollbackWithCreatedTempTable = 1751 + ErrWarningNotCompleteRollbackWithDroppedTempTable = 1752 + ErrMtsFeatureIsNotSupported = 1753 + ErrMtsUpdatedDBsGreaterMax = 1754 + ErrMtsCantParallel = 1755 + ErrMtsInconsistentData = 1756 + ErrFulltextNotSupportedWithPartitioning = 1757 + ErrDaInvalidConditionNumber = 1758 + ErrInsecurePlainText = 1759 + ErrInsecureChangeMaster = 1760 + ErrForeignDuplicateKeyWithChildInfo = 1761 + ErrForeignDuplicateKeyWithoutChildInfo = 1762 + ErrSQLthreadWithSecureSlave = 1763 + ErrTableHasNoFt = 1764 + ErrVariableNotSettableInSfOrTrigger = 1765 + ErrVariableNotSettableInTransaction = 1766 + ErrGtidNextIsNotInGtidNextList = 1767 + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull = 1768 + ErrSetStatementCannotInvokeFunction = 1769 + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull = 1770 + ErrSkippingLoggedTransaction = 1771 + ErrMalformedGtidSetSpecification = 1772 + ErrMalformedGtidSetEncoding = 1773 + ErrMalformedGtidSpecification = 1774 + ErrGnoExhausted = 1775 + ErrBadSlaveAutoPosition = 1776 + ErrAutoPositionRequiresGtidModeOn = 1777 + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet = 1778 + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn = 1779 + ErrGtidModeRequiresBinlog = 1780 + ErrCantSetGtidNextToGtidWhenGtidModeIsOff = 1781 + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn = 1782 + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff = 1783 + ErrFoundGtidEventWhenGtidModeIsOff = 1784 + ErrGtidUnsafeNonTransactionalTable = 1785 + ErrGtidUnsafeCreateSelect = 1786 + ErrGtidUnsafeCreateDropTemporaryTableInTransaction = 1787 + ErrGtidModeCanOnlyChangeOneStepAtATime = 1788 + ErrMasterHasPurgedRequiredGtids = 1789 + ErrCantSetGtidNextWhenOwningGtid = 1790 + ErrUnknownExplainFormat = 1791 + ErrCantExecuteInReadOnlyTransaction = 1792 + ErrTooLongTablePartitionComment = 1793 + ErrSlaveConfiguration = 1794 + ErrInnodbFtLimit = 1795 + ErrInnodbNoFtTempTable = 1796 + ErrInnodbFtWrongDocidColumn = 1797 + ErrInnodbFtWrongDocidIndex = 1798 + ErrInnodbOnlineLogTooBig = 1799 + ErrUnknownAlterAlgorithm = 1800 + ErrUnknownAlterLock = 1801 + ErrMtsChangeMasterCantRunWithGaps = 1802 + ErrMtsRecoveryFailure = 1803 + ErrMtsResetWorkers = 1804 + ErrColCountDoesntMatchCorruptedV2 = 1805 + ErrSlaveSilentRetryTransaction = 1806 + ErrDiscardFkChecksRunning = 1807 + ErrTableSchemaMismatch = 1808 + ErrTableInSystemTablespace = 1809 + ErrIoRead = 1810 + ErrIoWrite = 1811 + ErrTablespaceMissing = 1812 + ErrTablespaceExists = 1813 + ErrTablespaceDiscarded = 1814 + ErrInternal = 1815 + ErrInnodbImport = 1816 + ErrInnodbIndexCorrupt = 1817 + ErrInvalidYearColumnLength = 1818 + ErrNotValidPassword = 1819 + ErrMustChangePassword = 1820 + ErrFkNoIndexChild = 1821 + ErrFkNoIndexParent = 1822 + ErrFkFailAddSystem = 1823 + ErrFkCannotOpenParent = 1824 + ErrFkIncorrectOption = 1825 + ErrFkDupName = 1826 + ErrPasswordFormat = 1827 + ErrFkColumnCannotDrop = 1828 + ErrFkColumnCannotDropChild = 1829 + ErrFkColumnNotNull = 1830 + ErrDupIndex = 1831 + ErrFkColumnCannotChange = 1832 + ErrFkColumnCannotChangeChild = 1833 + ErrFkCannotDeleteParent = 1834 + ErrMalformedPacket = 1835 + ErrReadOnlyMode = 1836 + ErrGtidNextTypeUndefinedGroup = 1837 + ErrVariableNotSettableInSp = 1838 + ErrCantSetGtidPurgedWhenGtidModeIsOff = 1839 + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty = 1840 + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty = 1841 + ErrGtidPurgedWasChanged = 1842 + ErrGtidExecutedWasChanged = 1843 + ErrBinlogStmtModeAndNoReplTables = 1844 + ErrAlterOperationNotSupported = 1845 + ErrAlterOperationNotSupportedReason = 1846 + ErrAlterOperationNotSupportedReasonCopy = 1847 + ErrAlterOperationNotSupportedReasonPartition = 1848 + ErrAlterOperationNotSupportedReasonFkRename = 1849 + ErrAlterOperationNotSupportedReasonColumnType = 1850 + ErrAlterOperationNotSupportedReasonFkCheck = 1851 + ErrAlterOperationNotSupportedReasonIgnore = 1852 + ErrAlterOperationNotSupportedReasonNopk = 1853 + ErrAlterOperationNotSupportedReasonAutoinc = 1854 + ErrAlterOperationNotSupportedReasonHiddenFts = 1855 + ErrAlterOperationNotSupportedReasonChangeFts = 1856 + ErrAlterOperationNotSupportedReasonFts = 1857 + ErrSQLSlaveSkipCounterNotSettableInGtidMode = 1858 + ErrDupUnknownInIndex = 1859 + ErrIdentCausesTooLongPath = 1860 + ErrAlterOperationNotSupportedReasonNotNull = 1861 + ErrMustChangePasswordLogin = 1862 + ErrRowInWrongPartition = 1863 + ErrErrorLast = 1863 + ErrBadGeneratedColumn = 3105 + ErrUnsupportedOnGeneratedColumn = 3106 + ErrGeneratedColumnNonPrior = 3107 + ErrDependentByGeneratedColumn = 3108 + ErrInvalidJSONText = 3140 + ErrInvalidJSONPath = 3143 + ErrInvalidJSONData = 3146 + ErrInvalidJSONPathWildcard = 3149 + ErrInvalidJSONContainsPathType = 3150 + ErrJSONUsedAsKey = 3152 + + // TiDB self-defined errors. + ErrMemExceedThreshold = 8001 + ErrForUpdateCantRetry = 8002 + ErrAdminCheckTable = 8003 + + // TiKV/PD errors. + ErrPDServerTimeout = 9001 + ErrTiKVServerTimeout = 9002 + ErrTiKVServerBusy = 9003 + ErrResolveLockTimeout = 9004 + ErrRegionUnavailable = 9005 + ErrGCTooEarly = 9006 + + ErrTxnTooLarge = 9500 +) diff --git a/mysql/errname.go b/mysql/errname.go new file mode 100644 index 000000000..3e99e9d30 --- /dev/null +++ b/mysql/errname.go @@ -0,0 +1,907 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQLErrName maps error code to MySQL error messages. +var MySQLErrName = map[uint16]string{ + ErrHashchk: "hashchk", + ErrNisamchk: "isamchk", + ErrNo: "NO", + ErrYes: "YES", + ErrCantCreateFile: "Can't create file '%-.200s' (errno: %d - %s)", + ErrCantCreateTable: "Can't create table '%-.200s' (errno: %d)", + ErrCantCreateDB: "Can't create database '%-.192s' (errno: %d)", + ErrDBCreateExists: "Can't create database '%-.192s'; database exists", + ErrDBDropExists: "Can't drop database '%-.192s'; database doesn't exist", + ErrDBDropDelete: "Error dropping database (can't delete '%-.192s', errno: %d)", + ErrDBDropRmdir: "Error dropping database (can't rmdir '%-.192s', errno: %d)", + ErrCantDeleteFile: "Error on delete of '%-.192s' (errno: %d - %s)", + ErrCantFindSystemRec: "Can't read record in system table", + ErrCantGetStat: "Can't get status of '%-.200s' (errno: %d - %s)", + ErrCantGetWd: "Can't get working directory (errno: %d - %s)", + ErrCantLock: "Can't lock file (errno: %d - %s)", + ErrCantOpenFile: "Can't open file: '%-.200s' (errno: %d - %s)", + ErrFileNotFound: "Can't find file: '%-.200s' (errno: %d - %s)", + ErrCantReadDir: "Can't read dir of '%-.192s' (errno: %d - %s)", + ErrCantSetWd: "Can't change dir to '%-.192s' (errno: %d - %s)", + ErrCheckread: "Record has changed since last read in table '%-.192s'", + ErrDiskFull: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", + ErrDupKey: "Can't write; duplicate key in table '%-.192s'", + ErrErrorOnClose: "Error on close of '%-.192s' (errno: %d - %s)", + ErrErrorOnRead: "Error reading file '%-.200s' (errno: %d - %s)", + ErrErrorOnRename: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", + ErrErrorOnWrite: "Error writing file '%-.200s' (errno: %d - %s)", + ErrFileUsed: "'%-.192s' is locked against change", + ErrFilsortAbort: "Sort aborted", + ErrFormNotFound: "View '%-.192s' doesn't exist for '%-.192s'", + ErrGetErrno: "Got error %d from storage engine", + ErrIllegalHa: "Table storage engine for '%-.192s' doesn't have this option", + ErrKeyNotFound: "Can't find record in '%-.192s'", + ErrNotFormFile: "Incorrect information in file: '%-.200s'", + ErrNotKeyFile: "Incorrect key file for table '%-.200s'; try to repair it", + ErrOldKeyFile: "Old key file for table '%-.192s'; repair it!", + ErrOpenAsReadonly: "Table '%-.192s' is read only", + ErrOutofMemory: "Out of memory; restart server and try again (needed %d bytes)", + ErrOutOfSortMemory: "Out of sort memory, consider increasing server sort buffer size", + ErrUnexpectedEOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", + ErrConCount: "Too many connections", + ErrOutOfResources: "Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", + ErrBadHost: "Can't get hostname for your address", + ErrHandshake: "Bad handshake", + ErrDBaccessDenied: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", + ErrAccessDenied: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", + ErrNoDB: "No database selected", + ErrUnknownCom: "Unknown command", + ErrBadNull: "Column '%-.192s' cannot be null", + ErrBadDB: "Unknown database '%-.192s'", + ErrTableExists: "Table '%-.192s' already exists", + ErrBadTable: "Unknown table '%-.100s'", + ErrNonUniq: "Column '%-.192s' in %-.192s is ambiguous", + ErrServerShutdown: "Server shutdown in progress", + ErrBadField: "Unknown column '%-.192s' in '%-.192s'", + ErrFieldNotInGroupBy: "Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by", + ErrWrongGroupField: "Can't group on '%-.192s'", + ErrWrongSumSelect: "Statement has sum functions and columns in same statement", + ErrWrongValueCount: "Column count doesn't match value count", + ErrTooLongIdent: "Identifier name '%-.100s' is too long", + ErrDupFieldName: "Duplicate column name '%-.192s'", + ErrDupKeyName: "Duplicate key name '%-.192s'", + ErrDupEntry: "Duplicate entry '%-.192s' for key %d", + ErrWrongFieldSpec: "Incorrect column specifier for column '%-.192s'", + ErrParse: "%s near '%-.80s' at line %d", + ErrEmptyQuery: "Query was empty", + ErrNonuniqTable: "Not unique table/alias: '%-.192s'", + ErrInvalidDefault: "Invalid default value for '%-.192s'", + ErrMultiplePriKey: "Multiple primary key defined", + ErrTooManyKeys: "Too many keys specified; max %d keys allowed", + ErrTooManyKeyParts: "Too many key parts specified; max %d parts allowed", + ErrTooLongKey: "Specified key was too long; max key length is %d bytes", + ErrKeyColumnDoesNotExits: "Key column '%-.192s' doesn't exist in table", + ErrBlobUsedAsKey: "BLOB column '%-.192s' can't be used in key specification with the used table type", + ErrTooBigFieldlength: "Column length too big for column '%-.192s' (max = %lu); use BLOB or TEXT instead", + ErrWrongAutoKey: "Incorrect table definition; there can be only one auto column and it must be defined as a key", + ErrReady: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", + ErrNormalShutdown: "%s: Normal shutdown\n", + ErrGotSignal: "%s: Got signal %d. Aborting!\n", + ErrShutdownComplete: "%s: Shutdown complete\n", + ErrForcingClose: "%s: Forcing close of thread %d user: '%-.48s'\n", + ErrIpsock: "Can't create IP socket", + ErrNoSuchIndex: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", + ErrWrongFieldTerminators: "Field separator argument is not what is expected; check the manual", + ErrBlobsAndNoTerminated: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", + ErrTextFileNotReadable: "The file '%-.128s' must be in the database directory or be readable by all", + ErrFileExists: "File '%-.200s' already exists", + ErrLoadInfo: "Records: %d Deleted: %d Skipped: %d Warnings: %d", + ErrAlterInfo: "Records: %d Duplicates: %d", + ErrWrongSubKey: "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", + ErrCantRemoveAllFields: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", + ErrCantDropFieldOrKey: "Can't DROP '%-.192s'; check that column/key exists", + ErrInsertInfo: "Records: %d Duplicates: %d Warnings: %d", + ErrUpdateTableUsed: "You can't specify target table '%-.192s' for update in FROM clause", + ErrNoSuchThread: "Unknown thread id: %lu", + ErrKillDenied: "You are not owner of thread %lu", + ErrNoTablesUsed: "No tables used", + ErrTooBigSet: "Too many strings for column %-.192s and SET", + ErrNoUniqueLogFile: "Can't generate a unique log-filename %-.200s.(1-999)\n", + ErrTableNotLockedForWrite: "Table '%-.192s' was locked with a READ lock and can't be updated", + ErrTableNotLocked: "Table '%-.192s' was not locked with LOCK TABLES", + ErrBlobCantHaveDefault: "BLOB/TEXT/JSON column '%-.192s' can't have a default value", + ErrWrongDBName: "Incorrect database name '%-.100s'", + ErrWrongTableName: "Incorrect table name '%-.100s'", + ErrTooBigSelect: "The SELECT would examine more than MAXJOINSIZE rows; check your WHERE and use SET SQLBIGSELECTS=1 or SET MAXJOINSIZE=# if the SELECT is okay", + ErrUnknown: "Unknown error", + ErrUnknownProcedure: "Unknown procedure '%-.192s'", + ErrWrongParamcountToProcedure: "Incorrect parameter count to procedure '%-.192s'", + ErrWrongParametersToProcedure: "Incorrect parameters to procedure '%-.192s'", + ErrUnknownTable: "Unknown table '%-.192s' in %-.32s", + ErrFieldSpecifiedTwice: "Column '%-.192s' specified twice", + ErrInvalidGroupFuncUse: "Invalid use of group function", + ErrUnsupportedExtension: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", + ErrTableMustHaveColumns: "A table must have at least 1 column", + ErrRecordFileFull: "The table '%-.192s' is full", + ErrUnknownCharacterSet: "Unknown character set: '%-.64s'", + ErrTooManyTables: "Too many tables; MySQL can only use %d tables in a join", + ErrTooManyFields: "Too many columns", + ErrTooBigRowsize: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %d. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", + ErrStackOverrun: "Thread stack overrun: Used: %d of a %d stack. Use 'mysqld --threadStack=#' to specify a bigger stack if needed", + ErrWrongOuterJoin: "Cross dependency found in OUTER JOIN; examine your ON conditions", + ErrNullColumnInIndex: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", + ErrCantFindUdf: "Can't load function '%-.192s'", + ErrCantInitializeUdf: "Can't initialize function '%-.192s'; %-.80s", + ErrUdfNoPaths: "No paths allowed for shared library", + ErrUdfExists: "Function '%-.192s' already exists", + ErrCantOpenLibrary: "Can't open shared library '%-.192s' (errno: %d %-.128s)", + ErrCantFindDlEntry: "Can't find symbol '%-.128s' in library", + ErrFunctionNotDefined: "Function '%-.192s' is not defined", + ErrHostIsBlocked: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", + ErrHostNotPrivileged: "Host '%-.64s' is not allowed to connect to this MySQL server", + ErrPasswordAnonymousUser: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", + ErrPasswordNotAllowed: "You must have privileges to update tables in the mysql database to be able to change passwords for others", + ErrPasswordNoMatch: "Can't find any matching row in the user table", + ErrUpdateInfo: "Rows matched: %d Changed: %d Warnings: %d", + ErrCantCreateThread: "Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", + ErrWrongValueCountOnRow: "Column count doesn't match value count at row %d", + ErrCantReopenTable: "Can't reopen table: '%-.192s'", + ErrInvalidUseOfNull: "Invalid use of NULL value", + ErrRegexp: "Got error '%-.64s' from regexp", + ErrMixOfGroupFuncAndFields: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", + ErrNonexistingGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s'", + ErrTableaccessDenied: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", + ErrColumnaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", + ErrIllegalGrantForTable: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", + ErrGrantWrongHostOrUser: "The host or user argument to GRANT is too long", + ErrNoSuchTable: "Table '%-.192s.%-.192s' doesn't exist", + ErrNonexistingTableGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", + ErrNotAllowedCommand: "The used command is not allowed with this MySQL version", + ErrSyntax: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", + ErrDelayedCantChangeLock: "Delayed insert thread couldn't get requested lock for table %-.192s", + ErrTooManyDelayedThreads: "Too many delayed threads in use", + ErrAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' (%-.64s)", + ErrNetPacketTooLarge: "Got a packet bigger than 'maxAllowedPacket' bytes", + ErrNetReadErrorFromPipe: "Got a read error from the connection pipe", + ErrNetFcntl: "Got an error from fcntl()", + ErrNetPacketsOutOfOrder: "Got packets out of order", + ErrNetUncompress: "Couldn't uncompress communication packet", + ErrNetRead: "Got an error reading communication packets", + ErrNetReadInterrupted: "Got timeout reading communication packets", + ErrNetErrorOnWrite: "Got an error writing communication packets", + ErrNetWriteInterrupted: "Got timeout writing communication packets", + ErrTooLongString: "Result string is longer than 'maxAllowedPacket' bytes", + ErrTableCantHandleBlob: "The used table type doesn't support BLOB/TEXT columns", + ErrTableCantHandleAutoIncrement: "The used table type doesn't support AUTOINCREMENT columns", + ErrDelayedInsertTableLocked: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", + ErrWrongColumnName: "Incorrect column name '%-.100s'", + ErrWrongKeyColumn: "The used storage engine can't index column '%-.192s'", + ErrWrongMrgTable: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", + ErrDupUnique: "Can't write, because of unique constraint, to table '%-.192s'", + ErrBlobKeyWithoutLength: "BLOB/TEXT column '%-.192s' used in key specification without a key length", + ErrPrimaryCantHaveNull: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", + ErrTooManyRows: "Result consisted of more than one row", + ErrRequiresPrimaryKey: "This table type requires a primary key", + ErrNoRaidCompiled: "This version of MySQL is not compiled with RAID support", + ErrUpdateWithoutKeyInSafeMode: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", + ErrKeyDoesNotExist: "Key '%-.192s' doesn't exist in table '%-.192s'", + ErrCheckNoSuchTable: "Can't open table", + ErrCheckNotImplemented: "The storage engine for the table doesn't support %s", + ErrCantDoThisDuringAnTransaction: "You are not allowed to execute this command in a transaction", + ErrErrorDuringCommit: "Got error %d during COMMIT", + ErrErrorDuringRollback: "Got error %d during ROLLBACK", + ErrErrorDuringFlushLogs: "Got error %d during FLUSHLOGS", + ErrErrorDuringCheckpoint: "Got error %d during CHECKPOINT", + ErrNewAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", + ErrDumpNotImplemented: "The storage engine for the table does not support binary table dump", + ErrFlushMasterBinlogClosed: "Binlog closed, cannot RESET MASTER", + ErrIndexRebuild: "Failed rebuilding the index of dumped table '%-.192s'", + ErrMaster: "Error from master: '%-.64s'", + ErrMasterNetRead: "Net error reading from master", + ErrMasterNetWrite: "Net error writing to master", + ErrFtMatchingKeyNotFound: "Can't find FULLTEXT index matching the column list", + ErrLockOrActiveTransaction: "Can't execute the given command because you have active locked tables or an active transaction", + ErrUnknownSystemVariable: "Unknown system variable '%-.64s'", + ErrCrashedOnUsage: "Table '%-.192s' is marked as crashed and should be repaired", + ErrCrashedOnRepair: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", + ErrWarningNotCompleteRollback: "Some non-transactional changed tables couldn't be rolled back", + ErrTransCacheFull: "Multi-statement transaction required more than 'maxBinlogCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrSlaveMustStop: "This operation cannot be performed with a running slave; run STOP SLAVE first", + ErrSlaveNotRunning: "This operation requires a running slave; configure slave and do START SLAVE", + ErrBadSlave: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", + ErrMasterInfo: "Could not initialize master info structure; more error messages can be found in the MySQL error log", + ErrSlaveThread: "Could not create slave thread; check system resources", + ErrTooManyUserConnections: "User %-.64s already has more than 'maxUserConnections' active connections", + ErrSetConstantsOnly: "You may only use constant expressions with SET", + ErrLockWaitTimeout: "Lock wait timeout exceeded; try restarting transaction", + ErrLockTableFull: "The total number of locks exceeds the lock table size", + ErrReadOnlyTransaction: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", + ErrDropDBWithReadLock: "DROP DATABASE not allowed while thread is holding global read lock", + ErrCreateDBWithReadLock: "CREATE DATABASE not allowed while thread is holding global read lock", + ErrWrongArguments: "Incorrect arguments to %s", + ErrNoPermissionToCreateUser: "'%-.48s'@'%-.64s' is not allowed to create new users", + ErrUnionTablesInDifferentDir: "Incorrect table definition; all MERGE tables must be in the same database", + ErrLockDeadlock: "Deadlock found when trying to get lock; try restarting transaction", + ErrTableCantHandleFt: "The used table type doesn't support FULLTEXT indexes", + ErrCannotAddForeign: "Cannot add foreign key constraint", + ErrNoReferencedRow: "Cannot add or update a child row: a foreign key constraint fails", + ErrRowIsReferenced: "Cannot delete or update a parent row: a foreign key constraint fails", + ErrConnectToMaster: "Error connecting to master: %-.128s", + ErrQueryOnMaster: "Error running query on master: %-.128s", + ErrErrorWhenExecutingCommand: "Error when executing command %s: %-.128s", + ErrWrongUsage: "Incorrect usage of %s and %s", + ErrWrongNumberOfColumnsInSelect: "The used SELECT statements have a different number of columns", + ErrCantUpdateWithReadlock: "Can't execute the query because you have a conflicting read lock", + ErrMixingNotAllowed: "Mixing of transactional and non-transactional tables is disabled", + ErrDupArgument: "Option '%s' used twice in statement", + ErrUserLimitReached: "User '%-.64s' has exceeded the '%s' resource (current value: %d)", + ErrSpecificAccessDenied: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", + ErrLocalVariable: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", + ErrGlobalVariable: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", + ErrNoDefault: "Variable '%-.64s' doesn't have a default value", + ErrWrongValueForVar: "Variable '%-.64s' can't be set to the value of '%-.200s'", + ErrWrongTypeForVar: "Incorrect argument type to variable '%-.64s'", + ErrVarCantBeRead: "Variable '%-.64s' can only be set, not read", + ErrCantUseOptionHere: "Incorrect usage/placement of '%s'", + ErrNotSupportedYet: "This version of MySQL doesn't yet support '%s'", + ErrMasterFatalErrorReadingBinlog: "Got fatal error %d from master when reading data from binary log: '%-.320s'", + ErrSlaveIgnoredTable: "Slave SQL thread ignored the query because of replicate-*-table rules", + ErrIncorrectGlobalLocalVar: "Variable '%-.192s' is a %s variable", + ErrWrongFkDef: "Incorrect foreign key definition for '%-.192s': %s", + ErrKeyRefDoNotMatchTableRef: "Key reference and table reference don't match", + ErrOperandColumns: "Operand should contain %d column(s)", + ErrSubqueryNo1Row: "Subquery returns more than 1 row", + ErrUnknownStmtHandler: "Unknown prepared statement handler (%.*s) given to %s", + ErrCorruptHelpDB: "Help database is corrupt or does not exist", + ErrCyclicReference: "Cyclic reference on subqueries", + ErrAutoConvert: "Converting column '%s' from %s to %s", + ErrIllegalReference: "Reference '%-.64s' not supported (%s)", + ErrDerivedMustHaveAlias: "Every derived table must have its own alias", + ErrSelectReduced: "Select %d was reduced during optimization", + ErrTablenameNotAllowedHere: "Table '%-.192s' from one of the SELECTs cannot be used in %-.32s", + ErrNotSupportedAuthMode: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", + ErrSpatialCantHaveNull: "All parts of a SPATIAL index must be NOT NULL", + ErrCollationCharsetMismatch: "COLLATION '%s' is not valid for CHARACTER SET '%s'", + ErrSlaveWasRunning: "Slave is already running", + ErrSlaveWasNotRunning: "Slave already has been stopped", + ErrTooBigForUncompress: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", + ErrZlibZMem: "ZLIB: Not enough memory", + ErrZlibZBuf: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", + ErrZlibZData: "ZLIB: Input data corrupted", + ErrCutValueGroupConcat: "Some rows were cut by GROUPCONCAT(%s)", + ErrWarnTooFewRecords: "Row %d doesn't contain data for all columns", + ErrWarnTooManyRecords: "Row %d was truncated; it contained more data than there were input columns", + ErrWarnNullToNotnull: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %d", + ErrWarnDataOutOfRange: "Out of range value for column '%s' at row %d", + WarnDataTruncated: "Data truncated for column '%s' at row %d", + ErrWarnUsingOtherHandler: "Using storage engine %s for table '%s'", + ErrCantAggregate2collations: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", + ErrDropUser: "Cannot drop one or more of the requested users", + ErrRevokeGrants: "Can't revoke all privileges for one or more of the requested users", + ErrCantAggregate3collations: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", + ErrCantAggregateNcollations: "Illegal mix of collations for operation '%s'", + ErrVariableIsNotStruct: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variableName)", + ErrUnknownCollation: "Unknown collation: '%-.64s'", + ErrSlaveIgnoredSslParams: "SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started", + ErrServerIsInSecureAuthMode: "Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", + ErrWarnFieldResolved: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", + ErrBadSlaveUntilCond: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", + ErrMissingSkipSlave: "It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart", + ErrUntilCondIgnored: "SQL thread is not to be started so UNTIL options are ignored", + ErrWrongNameForIndex: "Incorrect index name '%-.100s'", + ErrWrongNameForCatalog: "Incorrect catalog name '%-.100s'", + ErrWarnQcResize: "Query cache failed to set size %lu; new query cache size is %lu", + ErrBadFtColumn: "Column '%-.192s' cannot be part of FULLTEXT index", + ErrUnknownKeyCache: "Unknown key cache '%-.100s'", + ErrWarnHostnameWontWork: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", + ErrUnknownStorageEngine: "Unknown storage engine '%s'", + ErrWarnDeprecatedSyntax: "'%s' is deprecated and will be removed in a future release. Please use %s instead", + ErrNonUpdatableTable: "The target table %-.100s of the %s is not updatable", + ErrFeatureDisabled: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", + ErrOptionPreventsStatement: "The MySQL server is running with the %s option so it cannot execute this statement", + ErrDuplicatedValueInType: "Column '%-.100s' has duplicated value '%-.64s' in %s", + ErrTruncatedWrongValue: "Truncated incorrect %-.32s value: '%-.128s'", + ErrTooMuchAutoTimestampCols: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENTTIMESTAMP in DEFAULT or ON UPDATE clause", + ErrInvalidOnUpdate: "Invalid ON UPDATE clause for '%-.192s' column", + ErrUnsupportedPs: "This command is not supported in the prepared statement protocol yet", + ErrGetErrmsg: "Got error %d '%-.100s' from %s", + ErrGetTemporaryErrmsg: "Got temporary error %d '%-.100s' from %s", + ErrUnknownTimeZone: "Unknown or incorrect time zone: '%-.64s'", + ErrWarnInvalidTimestamp: "Invalid TIMESTAMP value in column '%s' at row %d", + ErrInvalidCharacterString: "Invalid %s character string: '%.64s'", + ErrWarnAllowedPacketOverflowed: "Result of %s() was larger than max_allowed_packet (%d) - truncated", + ErrConflictingDeclarations: "Conflicting declarations: '%s%s' and '%s%s'", + ErrSpNoRecursiveCreate: "Can't create a %s from within another stored routine", + ErrSpAlreadyExists: "%s %s already exists", + ErrSpDoesNotExist: "%s %s does not exist", + ErrSpDropFailed: "Failed to DROP %s %s", + ErrSpStoreFailed: "Failed to CREATE %s %s", + ErrSpLilabelMismatch: "%s with no matching label: %s", + ErrSpLabelRedefine: "Redefining label %s", + ErrSpLabelMismatch: "End-label %s without match", + ErrSpUninitVar: "Referring to uninitialized variable %s", + ErrSpBadselect: "PROCEDURE %s can't return a result set in the given context", + ErrSpBadreturn: "RETURN is only allowed in a FUNCTION", + ErrSpBadstatement: "%s is not allowed in stored procedures", + ErrUpdateLogDeprecatedIgnored: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been ignored.", + ErrUpdateLogDeprecatedTranslated: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been translated to SET SQLLOGBIN.", + ErrQueryInterrupted: "Query execution was interrupted", + ErrSpWrongNoOfArgs: "Incorrect number of arguments for %s %s; expected %d, got %d", + ErrSpCondMismatch: "Undefined CONDITION: %s", + ErrSpNoreturn: "No RETURN found in FUNCTION %s", + ErrSpNoreturnend: "FUNCTION %s ended without RETURN", + ErrSpBadCursorQuery: "Cursor statement must be a SELECT", + ErrSpBadCursorSelect: "Cursor SELECT must not have INTO", + ErrSpCursorMismatch: "Undefined CURSOR: %s", + ErrSpCursorAlreadyOpen: "Cursor is already open", + ErrSpCursorNotOpen: "Cursor is not open", + ErrSpUndeclaredVar: "Undeclared variable: %s", + ErrSpWrongNoOfFetchArgs: "Incorrect number of FETCH variables", + ErrSpFetchNoData: "No data - zero rows fetched, selected, or processed", + ErrSpDupParam: "Duplicate parameter: %s", + ErrSpDupVar: "Duplicate variable: %s", + ErrSpDupCond: "Duplicate condition: %s", + ErrSpDupCurs: "Duplicate cursor: %s", + ErrSpCantAlter: "Failed to ALTER %s %s", + ErrSpSubselectNyi: "Subquery value not supported", + ErrStmtNotAllowedInSfOrTrg: "%s is not allowed in stored function or trigger", + ErrSpVarcondAfterCurshndlr: "Variable or condition declaration after cursor or handler declaration", + ErrSpCursorAfterHandler: "Cursor declaration after handler declaration", + ErrSpCaseNotFound: "Case not found for CASE statement", + ErrFparserTooBigFile: "Configuration file '%-.192s' is too big", + ErrFparserBadHeader: "Malformed file type header in file '%-.192s'", + ErrFparserEOFInComment: "Unexpected end of file while parsing comment '%-.200s'", + ErrFparserErrorInParameter: "Error while parsing parameter '%-.192s' (line: '%-.192s')", + ErrFparserEOFInUnknownParameter: "Unexpected end of file while skipping unknown parameter '%-.192s'", + ErrViewNoExplain: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", + ErrFrmUnknownType: "File '%-.192s' has unknown type '%-.64s' in its header", + ErrWrongObject: "'%-.192s.%-.192s' is not %s", + ErrNonupdateableColumn: "Column '%-.192s' is not updatable", + ErrViewSelectDerived: "View's SELECT contains a subquery in the FROM clause", + ErrViewSelectClause: "View's SELECT contains a '%s' clause", + ErrViewSelectVariable: "View's SELECT contains a variable or parameter", + ErrViewSelectTmptable: "View's SELECT refers to a temporary table '%-.192s'", + ErrViewWrongList: "View's SELECT and view's field list have different column counts", + ErrWarnViewMerge: "View merge algorithm can't be used here for now (assumed undefined algorithm)", + ErrWarnViewWithoutKey: "View being updated does not have complete key of underlying table in it", + ErrViewInvalid: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", + ErrSpNoDropSp: "Can't drop or alter a %s from within another stored routine", + ErrSpGotoInHndlr: "GOTO is not allowed in a stored procedure handler", + ErrTrgAlreadyExists: "Trigger already exists", + ErrTrgDoesNotExist: "Trigger does not exist", + ErrTrgOnViewOrTempTable: "Trigger's '%-.192s' is view or temporary table", + ErrTrgCantChangeRow: "Updating of %s row is not allowed in %strigger", + ErrTrgNoSuchRowInTrg: "There is no %s row in %s trigger", + ErrNoDefaultForField: "Field '%-.192s' doesn't have a default value", + ErrDivisionByZero: "Division by 0", + ErrTruncatedWrongValueForField: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", + ErrIllegalValueForType: "Illegal %s '%-.192s' value found during parsing", + ErrViewNonupdCheck: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", + ErrViewCheckFailed: "CHECK OPTION failed '%-.192s.%-.192s'", + ErrProcaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", + ErrRelayLogFail: "Failed purging old relay logs: %s", + ErrPasswdLength: "Password hash should be a %d-digit hexadecimal number", + ErrUnknownTargetBinlog: "Target log not found in binlog index", + ErrIoErrLogIndexRead: "I/O error reading log index file", + ErrBinlogPurgeProhibited: "Server configuration does not permit binlog purge", + ErrFseekFail: "Failed on fseek()", + ErrBinlogPurgeFatalErr: "Fatal error during log purge", + ErrLogInUse: "A purgeable log is in use, will not purge", + ErrLogPurgeUnknownErr: "Unknown error during log purge", + ErrRelayLogInit: "Failed initializing relay log position: %s", + ErrNoBinaryLogging: "You are not using binary logging", + ErrReservedSyntax: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", + ErrWsasFailed: "WSAStartup Failed", + ErrDiffGroupsProc: "Can't handle procedures with different groups yet", + ErrNoGroupForProc: "Select must have a group with this procedure", + ErrOrderWithProc: "Can't use ORDER clause with this procedure", + ErrLoggingProhibitChangingOf: "Binary logging and replication forbid changing the global server %s", + ErrNoFileMapping: "Can't map file: %-.200s, errno: %d", + ErrWrongMagic: "Wrong magic in %-.64s", + ErrPsManyParam: "Prepared statement contains too many placeholders", + ErrKeyPart0: "Key part '%-.192s' length cannot be 0", + ErrViewChecksum: "View text checksum failed", + ErrViewMultiupdate: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", + ErrViewNoInsertFieldList: "Can not insert into join view '%-.192s.%-.192s' without fields list", + ErrViewDeleteMergeView: "Can not delete from join view '%-.192s.%-.192s'", + ErrCannotUser: "Operation %s failed for %.256s", + ErrXaerNota: "XAERNOTA: Unknown XID", + ErrXaerInval: "XAERINVAL: Invalid arguments (or unsupported command)", + ErrXaerRmfail: "XAERRMFAIL: The command cannot be executed when global transaction is in the %.64s state", + ErrXaerOutside: "XAEROUTSIDE: Some work is done outside global transaction", + ErrXaerRmerr: "XAERRMERR: Fatal error occurred in the transaction branch - check your data for consistency", + ErrXaRbrollback: "XARBROLLBACK: Transaction branch was rolled back", + ErrNonexistingProcGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", + ErrProcAutoGrantFail: "Failed to grant EXECUTE and ALTER ROUTINE privileges", + ErrProcAutoRevokeFail: "Failed to revoke all privileges to dropped routine", + ErrDataTooLong: "Data too long for column '%s' at row %d", + ErrSpBadSQLstate: "Bad SQLSTATE: '%s'", + ErrStartup: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", + ErrLoadFromFixedSizeRowsToVar: "Can't load value from file with fixed size rows to variable", + ErrCantCreateUserWithGrant: "You are not allowed to create a user with GRANT", + ErrWrongValueForType: "Incorrect %-.32s value: '%-.128s' for function %-.32s", + ErrTableDefChanged: "Table definition has changed, please retry transaction", + ErrSpDupHandler: "Duplicate handler declared in the same block", + ErrSpNotVarArg: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", + ErrSpNoRetset: "Not allowed to return a result set from a %s", + ErrCantCreateGeometryObject: "Cannot get geometry object from data you send to the GEOMETRY field", + ErrFailedRoutineBreakBinlog: "A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", + ErrBinlogUnsafeRoutine: "This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrBinlogCreateRoutineNeedSuper: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrExecStmtWithOpenCursor: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", + ErrStmtHasNoOpenCursor: "The statement (%lu) has no open cursor.", + ErrCommitNotAllowedInSfOrTrg: "Explicit or implicit commit is not allowed in stored function or trigger.", + ErrNoDefaultForViewField: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", + ErrSpNoRecursion: "Recursive stored functions and triggers are not allowed.", + ErrTooBigScale: "Too big scale %d specified for column '%-.192s'. Maximum is %d.", + ErrTooBigPrecision: "Too big precision %d specified for column '%-.192s'. Maximum is %d.", + ErrMBiggerThanD: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", + ErrWrongLockOfSystemTable: "You can't combine write-locking of system tables with other tables or lock types", + ErrConnectToForeignDataSource: "Unable to connect to foreign data source: %.64s", + ErrQueryOnForeignDataSource: "There was a problem processing the query on the foreign data source. Data source : %-.64s", + ErrForeignDataSourceDoesntExist: "The foreign data source you are trying to reference does not exist. Data source : %-.64s", + ErrForeignDataStringInvalidCantCreate: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", + ErrForeignDataStringInvalid: "The data source connection string '%-.64s' is not in the correct format", + ErrCantCreateFederatedTable: "Can't create federated table. Foreign data src : %-.64s", + ErrTrgInWrongSchema: "Trigger in wrong schema", + ErrStackOverrunNeedMore: "Thread stack overrun: %d bytes used of a %d byte stack, and %d bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", + ErrTooLongBody: "Routine body for '%-.100s' is too long", + ErrWarnCantDropDefaultKeycache: "Cannot drop default keycache", + ErrTooBigDisplaywidth: "Display width out of range for column '%-.192s' (max = %lu)", + ErrXaerDupid: "XAERDUPID: The XID already exists", + ErrDatetimeFunctionOverflow: "Datetime function: %-.32s field overflow", + ErrCantUpdateUsedTableInSfOrTrg: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", + ErrViewPreventUpdate: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", + ErrPsNoRecursion: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", + ErrSpCantSetAutocommit: "Not allowed to set autocommit from a stored function or trigger", + ErrMalformedDefiner: "Definer is not fully qualified", + ErrViewFrmNoUser: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", + ErrViewOtherUser: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", + ErrNoSuchUser: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", + ErrForbidSchemaChange: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", + ErrRowIsReferenced2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", + ErrNoReferencedRow2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", + ErrSpBadVarShadow: "Variable '%-.64s' must be quoted with `...`, or renamed", + ErrTrgNoDefiner: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", + ErrOldFileFormat: "'%-.192s' has an old format, you should re-create the '%s' object(s)", + ErrSpRecursionLimit: "Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", + ErrSpProcTableCorrupt: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", + ErrSpWrongName: "Incorrect routine name '%-.192s'", + ErrTableNeedsUpgrade: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", + ErrSpNoAggregate: "AGGREGATE is not supported for stored functions", + ErrMaxPreparedStmtCountReached: "Can't create more than maxPreparedStmtCount statements (current value: %lu)", + ErrViewRecursive: "`%-.192s`.`%-.192s` contains view recursion", + ErrNonGroupingFieldUsed: "Non-grouping field '%-.192s' is used in %-.64s clause", + ErrTableCantHandleSpkeys: "The used table type doesn't support SPATIAL indexes", + ErrNoTriggersOnSystemSchema: "Triggers can not be created on system tables", + ErrRemovedSpaces: "Leading spaces are removed from name '%s'", + ErrAutoincReadFailed: "Failed to read auto-increment value from storage engine", + ErrUsername: "user name", + ErrHostname: "host name", + ErrWrongStringLength: "String '%-.70s' is too long for %s (should be no longer than %d)", + ErrNonInsertableTable: "The target table %-.100s of the %s is not insertable-into", + ErrAdminWrongMrgTable: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", + ErrTooHighLevelOfNestingForSelect: "Too high level of nesting for select", + ErrNameBecomesEmpty: "Name '%-.64s' has become ''", + ErrAmbiguousFieldTerm: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", + ErrForeignServerExists: "The foreign server, %s, you are trying to create already exists.", + ErrForeignServerDoesntExist: "The foreign server name you are trying to reference does not exist. Data source : %-.64s", + ErrIllegalHaCreateOption: "Table storage engine '%-.64s' does not support the create option '%.64s'", + ErrPartitionRequiresValues: "Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", + ErrPartitionWrongValues: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", + ErrPartitionMaxvalue: "MAXVALUE can only be used in last partition definition", + ErrPartitionSubpartition: "Subpartitions can only be hash partitions and by key", + ErrPartitionSubpartMix: "Must define subpartitions on all partitions if on one partition", + ErrPartitionWrongNoPart: "Wrong number of partitions defined, mismatch with previous setting", + ErrPartitionWrongNoSubpart: "Wrong number of subpartitions defined, mismatch with previous setting", + ErrWrongExprInPartitionFunc: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", + ErrNoConstExprInRangeOrList: "Expression in RANGE/LIST VALUES must be constant", + ErrFieldNotFoundPart: "Field in list of fields for partition function not found in table", + ErrListOfFieldsOnlyInHash: "List of fields is only allowed in KEY partitions", + ErrInconsistentPartitionInfo: "The partition info in the frm file is not consistent with what can be written into the frm file", + ErrPartitionFuncNotAllowed: "The %-.192s function returns the wrong type", + ErrPartitionsMustBeDefined: "For %-.64s partitions each partition must be defined", + ErrRangeNotIncreasing: "VALUES LESS THAN value must be strictly increasing for each partition", + ErrInconsistentTypeOfFunctions: "VALUES value must be of same type as partition function", + ErrMultipleDefConstInListPart: "Multiple definition of same constant in list partitioning", + ErrPartitionEntry: "Partitioning can not be used stand-alone in query", + ErrMixHandler: "The mix of handlers in the partitions is not allowed in this version of MySQL", + ErrPartitionNotDefined: "For the partitioned engine it is necessary to define all %-.64s", + ErrTooManyPartitions: "Too many partitions (including subpartitions) were defined", + ErrSubpartition: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", + ErrCantCreateHandlerFile: "Failed to create specific handler file", + ErrBlobFieldInPartFunc: "A BLOB field is not allowed in partition function", + ErrUniqueKeyNeedAllFieldsInPf: "A %-.192s must include all columns in the table's partitioning function", + ErrNoParts: "Number of %-.64s = 0 is not an allowed value", + ErrPartitionMgmtOnNonpartitioned: "Partition management on a not partitioned table is not possible", + ErrForeignKeyOnPartitioned: "Foreign key clause is not yet supported in conjunction with partitioning", + ErrDropPartitionNonExistent: "Error in list of partitions to %-.64s", + ErrDropLastPartition: "Cannot remove all partitions, use DROP TABLE instead", + ErrCoalesceOnlyOnHashPartition: "COALESCE PARTITION can only be used on HASH/KEY partitions", + ErrReorgHashOnlyOnSameNo: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", + ErrReorgNoParam: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", + ErrOnlyOnRangeListPartition: "%-.64s PARTITION can only be used on RANGE/LIST partitions", + ErrAddPartitionSubpart: "Trying to Add partition(s) with wrong number of subpartitions", + ErrAddPartitionNoNewPartition: "At least one partition must be added", + ErrCoalescePartitionNoPartition: "At least one partition must be coalesced", + ErrReorgPartitionNotExist: "More partitions to reorganize than there are partitions", + ErrSameNamePartition: "Duplicate partition name %-.192s", + ErrNoBinlog: "It is not allowed to shut off binlog on this command", + ErrConsecutiveReorgPartitions: "When reorganizing a set of partitions they must be in consecutive order", + ErrReorgOutsideRange: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", + ErrPartitionFunctionFailure: "Partition function not supported in this version for this handler", + ErrPartState: "Partition state cannot be defined from CREATE/ALTER TABLE", + ErrLimitedPartRange: "The %-.64s handler only supports 32 bit integers in VALUES", + ErrPluginIsNotLoaded: "Plugin '%-.192s' is not loaded", + ErrWrongValue: "Incorrect %-.32s value: '%-.128s'", + ErrNoPartitionForGivenValue: "Table has no partition for value %-.64s", + ErrFilegroupOptionOnlyOnce: "It is not allowed to specify %s more than once", + ErrCreateFilegroupFailed: "Failed to create %s", + ErrDropFilegroupFailed: "Failed to drop %s", + ErrTablespaceAutoExtend: "The handler doesn't support autoextend of tablespaces", + ErrWrongSizeNumber: "A size parameter was incorrectly specified, either number or on the form 10M", + ErrSizeOverflow: "The size number was correct but we don't allow the digit part to be more than 2 billion", + ErrAlterFilegroupFailed: "Failed to alter: %s", + ErrBinlogRowLoggingFailed: "Writing one row to the row-based binary log failed", + ErrBinlogRowWrongTableDef: "Table definition on master and slave does not match: %s", + ErrBinlogRowRbrToSbr: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", + ErrEventAlreadyExists: "Event '%-.192s' already exists", + ErrEventStoreFailed: "Failed to store event %s. Error code %d from storage engine.", + ErrEventDoesNotExist: "Unknown event '%-.192s'", + ErrEventCantAlter: "Failed to alter event '%-.192s'", + ErrEventDropFailed: "Failed to drop %s", + ErrEventIntervalNotPositiveOrTooBig: "INTERVAL is either not positive or too big", + ErrEventEndsBeforeStarts: "ENDS is either invalid or before STARTS", + ErrEventExecTimeInThePast: "Event execution time is in the past. Event has been disabled", + ErrEventOpenTableFailed: "Failed to open mysql.event", + ErrEventNeitherMExprNorMAt: "No datetime expression provided", + ErrObsoleteColCountDoesntMatchCorrupted: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrObsoleteCannotLoadFromTable: "Cannot load from mysql.%s. The table is probably corrupted", + ErrEventCannotDelete: "Failed to delete the event from mysql.event", + ErrEventCompile: "Error during compilation of event's body", + ErrEventSameName: "Same old and new event name", + ErrEventDataTooLong: "Data for column '%s' too long", + ErrDropIndexFk: "Cannot drop index '%-.192s': needed in a foreign key constraint", + ErrWarnDeprecatedSyntaxWithVer: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", + ErrCantWriteLockLogTable: "You can't write-lock a log table. Only read access is possible", + ErrCantLockLogTable: "You can't use locks with log tables.", + ErrForeignDuplicateKeyOldUnused: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", + ErrColCountDoesntMatchPleaseUpdate: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", + ErrTempTablePreventsSwitchOutOfRbr: "Cannot switch out of the row-based binary log format when the session has open temporary tables", + ErrStoredFunctionPreventsSwitchBinlogFormat: "Cannot change the binary logging format inside a stored function or trigger", + ErrNdbCantSwitchBinlogFormat: "The NDB cluster engine does not support changing the binlog format on the fly yet", + ErrPartitionNoTemporary: "Cannot create temporary table with partitions", + ErrPartitionConstDomain: "Partition constant is out of partition function domain", + ErrPartitionFunctionIsNotAllowed: "This partition function is not allowed", + ErrDdlLog: "Error in DDL log", + ErrNullInValuesLessThan: "Not allowed to use NULL value in VALUES LESS THAN", + ErrWrongPartitionName: "Incorrect partition name", + ErrCantChangeTxCharacteristics: "Transaction characteristics can't be changed while a transaction is in progress", + ErrDupEntryAutoincrementCase: "ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", + ErrEventModifyQueue: "Internal scheduler error %d", + ErrEventSetVar: "Error during starting/stopping of the scheduler. Error code %d", + ErrPartitionMerge: "Engine cannot be used in partitioned tables", + ErrCantActivateLog: "Cannot activate '%-.64s' log", + ErrRbrNotAvailable: "The server was not built with row-based replication", + ErrBase64Decode: "Decoding of base64 string failed", + ErrEventRecursionForbidden: "Recursion of EVENT DDL statements is forbidden when body is present", + ErrEventsDB: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", + ErrOnlyIntegersAllowed: "Only integers allowed as number here", + ErrUnsuportedLogEngine: "This storage engine cannot be used for log tables\"", + ErrBadLogStatement: "You cannot '%s' a log table if logging is enabled", + ErrCantRenameLogTable: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", + ErrWrongParamcountToNativeFct: "Incorrect parameter count in the call to native function '%-.192s'", + ErrWrongParametersToNativeFct: "Incorrect parameters in the call to native function '%-.192s'", + ErrWrongParametersToStoredFct: "Incorrect parameters in the call to stored function '%-.192s'", + ErrNativeFctNameCollision: "This function '%-.192s' has the same name as a native function", + ErrDupEntryWithKeyName: "Duplicate entry '%-.64s' for key '%-.192s'", + ErrBinlogPurgeEmFile: "Too many files opened, please execute the command again", + ErrEventCannotCreateInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", + ErrEventCannotAlterInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", + ErrSlaveIncident: "The incident %s occurred on the master. Message: %-.64s", + ErrNoPartitionForGivenValueSilent: "Table has no partition for some existing values", + ErrBinlogUnsafeStatement: "Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", + ErrSlaveFatal: "Fatal : %s", + ErrSlaveRelayLogReadFailure: "Relay log read failure: %s", + ErrSlaveRelayLogWriteFailure: "Relay log write failure: %s", + ErrSlaveCreateEventFailure: "Failed to create %s", + ErrSlaveMasterComFailure: "Master command %s failed: %s", + ErrBinlogLoggingImpossible: "Binary logging not possible. Message: %s", + ErrViewNoCreationCtx: "View `%-.64s`.`%-.64s` has no creation context", + ErrViewInvalidCreationCtx: "Creation context of view `%-.64s`.`%-.64s' is invalid", + ErrSrInvalidCreationCtx: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", + ErrTrgCorruptedFile: "Corrupted TRG file for table `%-.64s`.`%-.64s`", + ErrTrgNoCreationCtx: "Triggers for table `%-.64s`.`%-.64s` have no creation context", + ErrTrgInvalidCreationCtx: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", + ErrEventInvalidCreationCtx: "Creation context of event `%-.64s`.`%-.64s` is invalid", + ErrTrgCantOpenTable: "Cannot open table for trigger `%-.64s`.`%-.64s`", + ErrCantCreateSroutine: "Cannot create stored routine `%-.64s`. Check warnings", + ErrNeverUsed: "Ambiguous slave modes combination. %s", + ErrNoFormatDescriptionEventBeforeBinlogStatement: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", + ErrSlaveCorruptEvent: "Corrupted replication event was detected", + ErrLoadDataInvalidColumn: "Invalid column reference (%-.64s) in LOAD DATA", + ErrLogPurgeNoFile: "Being purged log %s was not found", + ErrXaRbtimeout: "XARBTIMEOUT: Transaction branch was rolled back: took too long", + ErrXaRbdeadlock: "XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", + ErrNeedReprepare: "Prepared statement needs to be re-prepared", + ErrDelayedNotSupported: "DELAYED option not supported for table '%-.192s'", + WarnNoMasterInfo: "The master info structure does not exist", + WarnOptionIgnored: "<%-.64s> option ignored", + WarnPluginDeleteBuiltin: "Built-in plugins cannot be deleted", + WarnPluginBusy: "Plugin is busy and will be uninstalled on shutdown", + ErrVariableIsReadonly: "%s variable '%s' is read-only. Use SET %s to assign the value", + ErrWarnEngineTransactionRollback: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", + ErrSlaveHeartbeatFailure: "Unexpected master's heartbeat data: %s", + ErrSlaveHeartbeatValueOutOfRange: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", + ErrNdbReplicationSchema: "Bad schema for mysql.ndbReplication table. Message: %-.64s", + ErrConflictFnParse: "Error in parsing conflict function. Message: %-.64s", + ErrExceptionsWrite: "Write to exceptions table failed. Message: %-.128s\"", + ErrTooLongTableComment: "Comment for table '%-.64s' is too long (max = %lu)", + ErrTooLongFieldComment: "Comment for field '%-.64s' is too long (max = %lu)", + ErrFuncInexistentNameCollision: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", + ErrDatabaseName: "Database", + ErrTableName: "Table", + ErrPartitionName: "Partition", + ErrSubpartitionName: "Subpartition", + ErrTemporaryName: "Temporary", + ErrRenamedName: "Renamed", + ErrTooManyConcurrentTrxs: "Too many active concurrent transactions", + WarnNonASCIISeparatorNotImplemented: "Non-ASCII separator arguments are not fully supported", + ErrDebugSyncTimeout: "debug sync point wait timed out", + ErrDebugSyncHitLimit: "debug sync point hit limit reached", + ErrDupSignalSet: "Duplicate condition information item '%s'", + ErrSignalWarn: "Unhandled user-defined warning condition", + ErrSignalNotFound: "Unhandled user-defined not found condition", + ErrSignalException: "Unhandled user-defined exception condition", + ErrResignalWithoutActiveHandler: "RESIGNAL when handler not active", + ErrSignalBadConditionType: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", + WarnCondItemTruncated: "Data truncated for condition item '%s'", + ErrCondItemTooLong: "Data too long for condition item '%s'", + ErrUnknownLocale: "Unknown locale: '%-.64s'", + ErrSlaveIgnoreServerIds: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", + ErrQueryCacheDisabled: "Query cache is disabled; restart the server with queryCacheType=1 to enable it", + ErrSameNamePartitionField: "Duplicate partition field name '%-.192s'", + ErrPartitionColumnList: "Inconsistency in usage of column lists for partitioning", + ErrWrongTypeColumnValue: "Partition column values of incorrect type", + ErrTooManyPartitionFuncFields: "Too many fields in '%-.192s'", + ErrMaxvalueInValuesIn: "Cannot use MAXVALUE as value in VALUES IN", + ErrTooManyValues: "Cannot have more than one value for this type of %-.64s partitioning", + ErrRowSinglePartitionField: "Row expressions in VALUES IN only allowed for multi-field column partitioning", + ErrFieldTypeNotAllowedAsPartitionField: "Field '%-.192s' is of a not allowed type for this type of partitioning", + ErrPartitionFieldsTooLong: "The total length of the partitioning fields is too large", + ErrBinlogRowEngineAndStmtEngine: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", + ErrBinlogRowModeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogUnsafeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", + ErrBinlogRowInjectionAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogStmtModeAndRowEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", + ErrBinlogRowInjectionAndStmtMode: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", + ErrBinlogMultipleEnginesAndSelfLoggingEngine: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", + ErrBinlogUnsafeLimit: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", + ErrBinlogUnsafeInsertDelayed: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", + ErrBinlogUnsafeSystemTable: "The statement is unsafe because it uses the general log, slow query log, or performanceSchema table(s). This is unsafe because system tables may differ on slaves.", + ErrBinlogUnsafeAutoincColumns: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", + ErrBinlogUnsafeUdf: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", + ErrBinlogUnsafeSystemVariable: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", + ErrBinlogUnsafeSystemFunction: "Statement is unsafe because it uses a system function that may return a different value on the slave.", + ErrBinlogUnsafeNontransAfterTrans: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", + ErrMessageAndStatement: "%s Statement: %s", + ErrSlaveConversionFailed: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", + ErrSlaveCantCreateConversion: "Can't create conversion table for table '%-.192s.%-.192s'", + ErrInsideTransactionPreventsSwitchBinlogFormat: "Cannot modify @@session.binlogFormat inside a transaction", + ErrPathLength: "The path specified for %.64s is too long.", + ErrWarnDeprecatedSyntaxNoReplacement: "'%s' is deprecated and will be removed in a future release.", + ErrWrongNativeTableStructure: "Native table '%-.64s'.'%-.64s' has the wrong structure", + ErrWrongPerfSchemaUsage: "Invalid performanceSchema usage.", + ErrWarnISSkippedTable: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", + ErrInsideTransactionPreventsSwitchBinlogDirect: "Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", + ErrStoredFunctionPreventsSwitchBinlogDirect: "Cannot change the binlog direct flag inside a stored function or trigger", + ErrSpatialMustHaveGeomCol: "A SPATIAL index may only contain a geometrical type column", + ErrTooLongIndexComment: "Comment for index '%-.64s' is too long (max = %d)", + ErrLockAborted: "Wait on a lock was aborted due to a pending exclusive lock", + ErrDataOutOfRange: "%s value is out of range in '%s'", + ErrWrongSpvarTypeInLimit: "A variable of a non-integer based type in LIMIT clause", + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", + ErrBinlogUnsafeMixedStatement: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", + ErrInsideTransactionPreventsSwitchSQLLogBin: "Cannot modify @@session.sqlLogBin inside a transaction", + ErrStoredFunctionPreventsSwitchSQLLogBin: "Cannot change the sqlLogBin inside a stored function or trigger", + ErrFailedReadFromParFile: "Failed to read from the .par file", + ErrValuesIsNotIntType: "VALUES value for partition '%-.64s' must have type INT", + ErrAccessDeniedNoPassword: "Access denied for user '%-.48s'@'%-.64s'", + ErrSetPasswordAuthPlugin: "SET PASSWORD has no significance for users authenticating via plugins", + ErrGrantPluginUserExists: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", + ErrTruncateIllegalFk: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", + ErrPluginIsPermanent: "Plugin '%s' is forcePlusPermanent and can not be unloaded", + ErrSlaveHeartbeatValueOutOfRangeMin: "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled.", + ErrSlaveHeartbeatValueOutOfRangeMax: "The requested value for the heartbeat period exceeds the value of `slaveNetTimeout' seconds. A sensible value for the period should be less than the timeout.", + ErrStmtCacheFull: "Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrMultiUpdateKeyConflict: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", + ErrTableNeedsRebuild: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", + WarnOptionBelowLimit: "The value of '%s' should be no less than the value of '%s'", + ErrIndexColumnTooLong: "Index column size too large. The maximum column size is %lu bytes.", + ErrErrorInTriggerBody: "Trigger '%-.64s' has an error in its body: '%-.256s'", + ErrErrorInUnknownTriggerBody: "Unknown trigger has an error in its body: '%-.256s'", + ErrIndexCorrupt: "Index %s is corrupted", + ErrUndoRecordTooBig: "Undo log record is too big.", + ErrBinlogUnsafeInsertIgnoreSelect: "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertSelectUpdate: "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeReplaceSelect: "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateIgnoreSelect: "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateReplaceSelect: "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeUpdateIgnore: "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrPluginNoUninstall: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", + ErrPluginNoInstall: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", + ErrBinlogUnsafeWriteAutoincSelect: "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateSelectAutoinc: "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertTwoKeys: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", + ErrTableInFkCheck: "Table is being used in foreign key check.", + ErrUnsupportedEngine: "Storage engine '%s' does not support system tables. [%s.%s]", + ErrBinlogUnsafeAutoincNotFirst: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", + ErrCannotLoadFromTableV2: "Cannot load from %s.%s. The table is probably corrupted", + ErrMasterDelayValueOutOfRange: "The requested value %d for the master delay exceeds the maximum %d", + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: "Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", + ErrPartitionExchangeDifferentOption: "Non matching attribute '%-.64s' between partition and table", + ErrPartitionExchangePartTable: "Table to exchange with partition is partitioned: '%-.64s'", + ErrPartitionExchangeTempTable: "Table to exchange with partition is temporary: '%-.64s'", + ErrPartitionInsteadOfSubpartition: "Subpartitioned table, use subpartition instead of partition", + ErrUnknownPartition: "Unknown partition '%-.64s' in table '%-.64s'", + ErrTablesDifferentMetadata: "Tables have different definitions", + ErrRowDoesNotMatchPartition: "Found a row that does not match the partition", + ErrBinlogCacheSizeGreaterThanMax: "Option binlogCacheSize (%lu) is greater than maxBinlogCacheSize (%lu); setting binlogCacheSize equal to maxBinlogCacheSize.", + ErrWarnIndexNotApplicable: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", + ErrPartitionExchangeForeignKey: "Table to exchange with partition has foreign key references: '%-.64s'", + ErrNoSuchKeyValue: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", + ErrRplInfoDataTooLong: "Data for column '%s' too long", + ErrNetworkReadEventChecksumFailure: "Replication event checksum verification failed while reading from network.", + ErrBinlogReadEventChecksumFailure: "Replication event checksum verification failed while reading from a log file.", + ErrBinlogStmtCacheSizeGreaterThanMax: "Option binlogStmtCacheSize (%lu) is greater than maxBinlogStmtCacheSize (%lu); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", + ErrCantUpdateTableInCreateTableSelect: "Can't update table '%-.192s' while '%-.192s' is being created.", + ErrPartitionClauseOnNonpartitioned: "PARTITION () clause on non partitioned table", + ErrRowDoesNotMatchGivenPartitionSet: "Found a row not matching the given partition set", + ErrNoSuchPartitionunused: "partition '%-.64s' doesn't exist", + ErrChangeRplInfoRepositoryFailure: "Failure while changing the type of replication repository: %s.", + ErrWarningNotCompleteRollbackWithCreatedTempTable: "The creation of some temporary tables could not be rolled back.", + ErrWarningNotCompleteRollbackWithDroppedTempTable: "Some temporary tables were dropped, but these operations could not be rolled back.", + ErrMtsFeatureIsNotSupported: "%s is not supported in multi-threaded slave mode. %s", + ErrMtsUpdatedDBsGreaterMax: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", + ErrMtsCantParallel: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", + ErrMtsInconsistentData: "%s", + ErrFulltextNotSupportedWithPartitioning: "FULLTEXT index is not supported for partitioned tables.", + ErrDaInvalidConditionNumber: "Invalid condition number", + ErrInsecurePlainText: "Sending passwords in plain text without SSL/TLS is extremely insecure.", + ErrInsecureChangeMaster: "Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives.", + ErrForeignDuplicateKeyWithChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", + ErrForeignDuplicateKeyWithoutChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", + ErrSQLthreadWithSecureSlave: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", + ErrTableHasNoFt: "The table does not have FULLTEXT index to support this query", + ErrVariableNotSettableInSfOrTrigger: "The system variable %.200s cannot be set in stored functions or triggers.", + ErrVariableNotSettableInTransaction: "The system variable %.200s cannot be set when there is an ongoing transaction.", + ErrGtidNextIsNotInGtidNextList: "The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: "When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", + ErrSetStatementCannotInvokeFunction: "The statement 'SET %.200s' cannot invoke a stored function.", + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: "The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", + ErrSkippingLoggedTransaction: "Skipping transaction %.200s because it has already been executed and logged.", + ErrMalformedGtidSetSpecification: "Malformed GTID set specification '%.200s'.", + ErrMalformedGtidSetEncoding: "Malformed GTID set encoding.", + ErrMalformedGtidSpecification: "Malformed GTID specification '%.200s'.", + ErrGnoExhausted: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", + ErrBadSlaveAutoPosition: "Parameters MASTERLOGFILE, MASTERLOGPOS, RELAYLOGFILE and RELAYLOGPOS cannot be set when MASTERAUTOPOSITION is active.", + ErrAutoPositionRequiresGtidModeOn: "CHANGE MASTER TO MASTERAUTOPOSITION = 1 can only be executed when @@GLOBAL.GTIDMODE = ON.", + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidModeRequiresBinlog: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP1 or UPGRADESTEP2 requires --log-bin and --log-slave-updates.", + ErrCantSetGtidNextToGtidWhenGtidModeIsOff: "@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: "@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: "@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", + ErrFoundGtidEventWhenGtidModeIsOff: "Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", + ErrGtidUnsafeNonTransactionalTable: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", + ErrGtidUnsafeCreateSelect: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidUnsafeCreateDropTemporaryTableInTransaction: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", + ErrGtidModeCanOnlyChangeOneStepAtATime: "The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", + ErrMasterHasPurgedRequiredGtids: "The slave is connecting using CHANGE MASTER TO MASTERAUTOPOSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.", + ErrCantSetGtidNextWhenOwningGtid: "@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", + ErrUnknownExplainFormat: "Unknown EXPLAIN format name: '%s'", + ErrCantExecuteInReadOnlyTransaction: "Cannot execute statement in a READ ONLY transaction.", + ErrTooLongTablePartitionComment: "Comment for table partition '%-.64s' is too long (max = %lu)", + ErrSlaveConfiguration: "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.", + ErrInnodbFtLimit: "InnoDB presently supports one FULLTEXT index creation at a time", + ErrInnodbNoFtTempTable: "Cannot create FULLTEXT index on temporary InnoDB table", + ErrInnodbFtWrongDocidColumn: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbFtWrongDocidIndex: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbOnlineLogTooBig: "Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", + ErrUnknownAlterAlgorithm: "Unknown ALGORITHM '%s'", + ErrUnknownAlterLock: "Unknown LOCK type '%s'", + ErrMtsChangeMasterCantRunWithGaps: "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL.", + ErrMtsRecoveryFailure: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", + ErrMtsResetWorkers: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", + ErrColCountDoesntMatchCorruptedV2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrSlaveSilentRetryTransaction: "Slave must silently retry current transaction", + ErrDiscardFkChecksRunning: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", + ErrTableSchemaMismatch: "Schema mismatch (%s)", + ErrTableInSystemTablespace: "Table '%-.192s' in system tablespace", + ErrIoRead: "IO Read : (%lu, %s) %s", + ErrIoWrite: "IO Write : (%lu, %s) %s", + ErrTablespaceMissing: "Tablespace is missing for table '%-.192s'", + ErrTablespaceExists: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", + ErrTablespaceDiscarded: "Tablespace has been discarded for table '%-.192s'", + ErrInternal: "Internal : %s", + ErrInnodbImport: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %lu : '%s'", + ErrInnodbIndexCorrupt: "Index corrupt: %s", + ErrInvalidYearColumnLength: "YEAR(%lu) column type is deprecated. Creating YEAR(4) column instead.", + ErrNotValidPassword: "Your password does not satisfy the current policy requirements", + ErrMustChangePassword: "You must SET PASSWORD before executing this statement", + ErrFkNoIndexChild: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", + ErrFkNoIndexParent: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", + ErrFkFailAddSystem: "Failed to add the foreign key constraint '%s' to system tables", + ErrFkCannotOpenParent: "Failed to open the referenced table '%s'", + ErrFkIncorrectOption: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", + ErrFkDupName: "Duplicate foreign key constraint name '%s'", + ErrPasswordFormat: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", + ErrFkColumnCannotDrop: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", + ErrFkColumnCannotDropChild: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkColumnNotNull: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", + ErrDupIndex: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", + ErrFkColumnCannotChange: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", + ErrFkColumnCannotChangeChild: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkCannotDeleteParent: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrMalformedPacket: "Malformed communication packet.", + ErrReadOnlyMode: "Running in read-only mode", + ErrGtidNextTypeUndefinedGroup: "When @@SESSION.GTIDNEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the slave SQL thread, it means that a table in the current transaction is transactional on the master and non-transactional on the slave. In a client connection, it means that you executed SET @@SESSION.GTIDNEXT before a transaction and forgot to set @@SESSION.GTIDNEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTIDNEXT is '%s'.", + ErrVariableNotSettableInSp: "The system variable %.200s cannot be set in stored procedures.", + ErrCantSetGtidPurgedWhenGtidModeIsOff: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", + ErrGtidPurgedWasChanged: "@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", + ErrGtidExecutedWasChanged: "@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", + ErrBinlogStmtModeAndNoReplTables: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", + ErrAlterOperationNotSupported: "%s is not supported for this operation. Try %s.", + ErrAlterOperationNotSupportedReason: "%s is not supported. Reason: %s. Try %s.", + ErrAlterOperationNotSupportedReasonCopy: "COPY algorithm requires a lock", + ErrAlterOperationNotSupportedReasonPartition: "Partition specific operations do not yet support LOCK/ALGORITHM", + ErrAlterOperationNotSupportedReasonFkRename: "Columns participating in a foreign key are renamed", + ErrAlterOperationNotSupportedReasonColumnType: "Cannot change column type INPLACE", + ErrAlterOperationNotSupportedReasonFkCheck: "Adding foreign keys needs foreignKeyChecks=OFF", + ErrAlterOperationNotSupportedReasonIgnore: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", + ErrAlterOperationNotSupportedReasonNopk: "Dropping a primary key is not allowed without also adding a new primary key", + ErrAlterOperationNotSupportedReasonAutoinc: "Adding an auto-increment column requires a lock", + ErrAlterOperationNotSupportedReasonHiddenFts: "Cannot replace hidden FTSDOCID with a user-visible one", + ErrAlterOperationNotSupportedReasonChangeFts: "Cannot drop or rename FTSDOCID", + ErrAlterOperationNotSupportedReasonFts: "Fulltext index creation requires a lock", + ErrSQLSlaveSkipCounterNotSettableInGtidMode: "sqlSlaveSkipCounter can not be set when the server is running with @@GLOBAL.GTIDMODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", + ErrDupUnknownInIndex: "Duplicate entry for key '%-.192s'", + ErrIdentCausesTooLongPath: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", + ErrAlterOperationNotSupportedReasonNotNull: "cannot silently convert NULL values, as required in this SQLMODE", + ErrMustChangePasswordLogin: "Your password has expired. To log in you must change it using a client that supports expired passwords.", + ErrRowInWrongPartition: "Found a row in wrong partition %s", + ErrBadGeneratedColumn: "The value specified for generated column '%s' in table '%s' is not allowed.", + ErrUnsupportedOnGeneratedColumn: "'%s' is not supported for generated columns.", + ErrGeneratedColumnNonPrior: "Generated column can refer only to generated columns defined prior to it.", + ErrDependentByGeneratedColumn: "Column '%s' has a generated column dependency.", + ErrInvalidJSONText: "Invalid JSON text: %-.192s", + ErrInvalidJSONPath: "Invalid JSON path expression %s.", + ErrInvalidJSONData: "Invalid data type for JSON data", + ErrInvalidJSONPathWildcard: "In this situation, path expressions may not contain the * and ** tokens.", + ErrInvalidJSONContainsPathType: "The second argument can only be either 'one' or 'all'.", + ErrJSONUsedAsKey: "JSON column '%-.192s' cannot be used in key specification.", + + // TiDB errors. + ErrMemExceedThreshold: "%s holds %dB memory, exceeds threshold %dB.%s", + ErrForUpdateCantRetry: "[%d] can not retry select for update statement", + ErrAdminCheckTable: "TiDB admin check table failed.", + + // TiKV/PD errors. + ErrPDServerTimeout: "PD server timeout", + ErrTiKVServerTimeout: "TiKV server timeout", + ErrTiKVServerBusy: "TiKV server is busy", + ErrResolveLockTimeout: "Resolve lock timeout", + ErrRegionUnavailable: "Region is unavailable", + ErrGCTooEarly: "GC life time is shorter than transaction duration, transaction starts at %v, GC safe point is %v", + + ErrTxnTooLarge: "Transaction is too large", +} diff --git a/mysql/error.go b/mysql/error.go new file mode 100644 index 000000000..fd6316ca2 --- /dev/null +++ b/mysql/error.go @@ -0,0 +1,71 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "errors" + "fmt" +) + +// Portable analogs of some common call errors. +var ( + ErrBadConn = errors.New("connection was bad") + ErrMalformPacket = errors.New("malform packet error") +) + +// SQLError records an error information, from executing SQL. +type SQLError struct { + Code uint16 + Message string + State string +} + +// Error prints errors, with a formatted string. +func (e *SQLError) Error() string { + return fmt.Sprintf("ERROR %d (%s): %s", e.Code, e.State, e.Message) +} + +// NewErr generates a SQL error, with an error code and default format specifier defined in MySQLErrName. +func NewErr(errCode uint16, args ...interface{}) *SQLError { + e := &SQLError{Code: errCode} + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DefaultMySQLState + } + + if format, ok := MySQLErrName[errCode]; ok { + e.Message = fmt.Sprintf(format, args...) + } else { + e.Message = fmt.Sprint(args...) + } + + return e +} + +// NewErrf creates a SQL error, with an error code and a format specifier. +func NewErrf(errCode uint16, format string, args ...interface{}) *SQLError { + e := &SQLError{Code: errCode} + + if s, ok := MySQLState[errCode]; ok { + e.State = s + } else { + e.State = DefaultMySQLState + } + + e.Message = fmt.Sprintf(format, args...) + + return e +} diff --git a/mysql/error_test.go b/mysql/error_test.go new file mode 100644 index 000000000..a57c54835 --- /dev/null +++ b/mysql/error_test.go @@ -0,0 +1,37 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testSQLErrorSuite{}) + +type testSQLErrorSuite struct { +} + +func (s *testSQLErrorSuite) TestSQLError(c *C) { + e := NewErrf(ErrNoDB, "no db error") + c.Assert(len(e.Error()), Greater, 0) + + e = NewErrf(0, "customized error") + c.Assert(len(e.Error()), Greater, 0) + + e = NewErr(ErrNoDB) + c.Assert(len(e.Error()), Greater, 0) + + e = NewErr(0, "customized error") + c.Assert(len(e.Error()), Greater, 0) +} diff --git a/mysql/locale_format.go b/mysql/locale_format.go new file mode 100644 index 000000000..b483f94fc --- /dev/null +++ b/mysql/locale_format.go @@ -0,0 +1,98 @@ +package mysql + +import ( + "bytes" + "strconv" + "strings" + "unicode" + + "github.com/pingcap/errors" +) + +func formatENUS(number string, precision string) (string, error) { + var buffer bytes.Buffer + if unicode.IsDigit(rune(precision[0])) { + for i, v := range precision { + if unicode.IsDigit(v) { + continue + } + precision = precision[:i] + break + } + } else { + precision = "0" + } + if number[0] == '-' && number[1] == '.' { + number = strings.Replace(number, "-", "-0", 1) + } else if number[0] == '.' { + number = strings.Replace(number, ".", "0.", 1) + } + + if (number[:1] == "-" && !unicode.IsDigit(rune(number[1]))) || + (!unicode.IsDigit(rune(number[0])) && number[:1] != "-") { + buffer.Write([]byte{'0'}) + position, err := strconv.ParseUint(precision, 10, 64) + if err == nil && position > 0 { + buffer.Write([]byte{'.'}) + buffer.WriteString(strings.Repeat("0", int(position))) + } + return buffer.String(), nil + } else if number[:1] == "-" { + buffer.Write([]byte{'-'}) + number = number[1:] + } + + for i, v := range number { + if unicode.IsDigit(v) { + continue + } else if i == 1 && number[1] == '.' { + continue + } else if v == '.' && number[1] != '.' { + continue + } else { + number = number[:i] + break + } + } + + comma := []byte{','} + parts := strings.Split(number, ".") + pos := 0 + if len(parts[0])%3 != 0 { + pos += len(parts[0]) % 3 + buffer.WriteString(parts[0][:pos]) + buffer.Write(comma) + } + for ; pos < len(parts[0]); pos += 3 { + buffer.WriteString(parts[0][pos : pos+3]) + buffer.Write(comma) + } + buffer.Truncate(buffer.Len() - 1) + + position, err := strconv.ParseUint(precision, 10, 64) + if err == nil { + if position > 0 { + buffer.Write([]byte{'.'}) + if len(parts) == 2 { + if uint64(len(parts[1])) >= position { + buffer.WriteString(parts[1][:position]) + } else { + buffer.WriteString(parts[1]) + buffer.WriteString(strings.Repeat("0", int(position)-len(parts[1]))) + } + } else { + buffer.WriteString(strings.Repeat("0", int(position))) + } + } + } + + return buffer.String(), nil +} + +func formatZHCN(number string, precision string) (string, error) { + return "", errors.New("not implemented") +} + +func formatNotSupport(number string, precision string) (string, error) { + return "", errors.New("not support for the specific locale") +} diff --git a/mysql/state.go b/mysql/state.go new file mode 100644 index 000000000..a31f61c01 --- /dev/null +++ b/mysql/state.go @@ -0,0 +1,258 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +const ( + // DefaultMySQLState is default state of the mySQL + DefaultMySQLState = "HY000" +) + +// MySQLState maps error code to MySQL SQLSTATE value. +// The values are taken from ANSI SQL and ODBC and are more standardized. +var MySQLState = map[uint16]string{ + ErrDupKey: "23000", + ErrOutofMemory: "HY001", + ErrOutOfSortMemory: "HY001", + ErrConCount: "08004", + ErrBadHost: "08S01", + ErrHandshake: "08S01", + ErrDBaccessDenied: "42000", + ErrAccessDenied: "28000", + ErrNoDB: "3D000", + ErrUnknownCom: "08S01", + ErrBadNull: "23000", + ErrBadDB: "42000", + ErrTableExists: "42S01", + ErrBadTable: "42S02", + ErrNonUniq: "23000", + ErrServerShutdown: "08S01", + ErrBadField: "42S22", + ErrFieldNotInGroupBy: "42000", + ErrWrongSumSelect: "42000", + ErrWrongGroupField: "42000", + ErrWrongValueCount: "21S01", + ErrTooLongIdent: "42000", + ErrDupFieldName: "42S21", + ErrDupKeyName: "42000", + ErrDupEntry: "23000", + ErrWrongFieldSpec: "42000", + ErrParse: "42000", + ErrEmptyQuery: "42000", + ErrNonuniqTable: "42000", + ErrInvalidDefault: "42000", + ErrMultiplePriKey: "42000", + ErrTooManyKeys: "42000", + ErrTooManyKeyParts: "42000", + ErrTooLongKey: "42000", + ErrKeyColumnDoesNotExits: "42000", + ErrBlobUsedAsKey: "42000", + ErrTooBigFieldlength: "42000", + ErrWrongAutoKey: "42000", + ErrForcingClose: "08S01", + ErrIpsock: "08S01", + ErrNoSuchIndex: "42S12", + ErrWrongFieldTerminators: "42000", + ErrBlobsAndNoTerminated: "42000", + ErrCantRemoveAllFields: "42000", + ErrCantDropFieldOrKey: "42000", + ErrBlobCantHaveDefault: "42000", + ErrWrongDBName: "42000", + ErrWrongTableName: "42000", + ErrTooBigSelect: "42000", + ErrUnknownProcedure: "42000", + ErrWrongParamcountToProcedure: "42000", + ErrUnknownTable: "42S02", + ErrFieldSpecifiedTwice: "42000", + ErrUnsupportedExtension: "42000", + ErrTableMustHaveColumns: "42000", + ErrUnknownCharacterSet: "42000", + ErrTooBigRowsize: "42000", + ErrWrongOuterJoin: "42000", + ErrNullColumnInIndex: "42000", + ErrPasswordAnonymousUser: "42000", + ErrPasswordNotAllowed: "42000", + ErrPasswordNoMatch: "42000", + ErrWrongValueCountOnRow: "21S01", + ErrInvalidUseOfNull: "22004", + ErrRegexp: "42000", + ErrMixOfGroupFuncAndFields: "42000", + ErrNonexistingGrant: "42000", + ErrTableaccessDenied: "42000", + ErrColumnaccessDenied: "42000", + ErrIllegalGrantForTable: "42000", + ErrGrantWrongHostOrUser: "42000", + ErrNoSuchTable: "42S02", + ErrNonexistingTableGrant: "42000", + ErrNotAllowedCommand: "42000", + ErrSyntax: "42000", + ErrAbortingConnection: "08S01", + ErrNetPacketTooLarge: "08S01", + ErrNetReadErrorFromPipe: "08S01", + ErrNetFcntl: "08S01", + ErrNetPacketsOutOfOrder: "08S01", + ErrNetUncompress: "08S01", + ErrNetRead: "08S01", + ErrNetReadInterrupted: "08S01", + ErrNetErrorOnWrite: "08S01", + ErrNetWriteInterrupted: "08S01", + ErrTooLongString: "42000", + ErrTableCantHandleBlob: "42000", + ErrTableCantHandleAutoIncrement: "42000", + ErrWrongColumnName: "42000", + ErrWrongKeyColumn: "42000", + ErrDupUnique: "23000", + ErrBlobKeyWithoutLength: "42000", + ErrPrimaryCantHaveNull: "42000", + ErrTooManyRows: "42000", + ErrRequiresPrimaryKey: "42000", + ErrKeyDoesNotExist: "42000", + ErrCheckNoSuchTable: "42000", + ErrCheckNotImplemented: "42000", + ErrCantDoThisDuringAnTransaction: "25000", + ErrNewAbortingConnection: "08S01", + ErrMasterNetRead: "08S01", + ErrMasterNetWrite: "08S01", + ErrTooManyUserConnections: "42000", + ErrReadOnlyTransaction: "25000", + ErrNoPermissionToCreateUser: "42000", + ErrLockDeadlock: "40001", + ErrNoReferencedRow: "23000", + ErrRowIsReferenced: "23000", + ErrConnectToMaster: "08S01", + ErrWrongNumberOfColumnsInSelect: "21000", + ErrUserLimitReached: "42000", + ErrSpecificAccessDenied: "42000", + ErrNoDefault: "42000", + ErrWrongValueForVar: "42000", + ErrWrongTypeForVar: "42000", + ErrCantUseOptionHere: "42000", + ErrNotSupportedYet: "42000", + ErrWrongFkDef: "42000", + ErrOperandColumns: "21000", + ErrSubqueryNo1Row: "21000", + ErrIllegalReference: "42S22", + ErrDerivedMustHaveAlias: "42000", + ErrSelectReduced: "01000", + ErrTablenameNotAllowedHere: "42000", + ErrNotSupportedAuthMode: "08004", + ErrSpatialCantHaveNull: "42000", + ErrCollationCharsetMismatch: "42000", + ErrWarnTooFewRecords: "01000", + ErrWarnTooManyRecords: "01000", + ErrWarnNullToNotnull: "22004", + ErrWarnDataOutOfRange: "22003", + WarnDataTruncated: "01000", + ErrWrongNameForIndex: "42000", + ErrWrongNameForCatalog: "42000", + ErrUnknownStorageEngine: "42000", + ErrTruncatedWrongValue: "22007", + ErrSpNoRecursiveCreate: "2F003", + ErrSpAlreadyExists: "42000", + ErrSpDoesNotExist: "42000", + ErrSpLilabelMismatch: "42000", + ErrSpLabelRedefine: "42000", + ErrSpLabelMismatch: "42000", + ErrSpUninitVar: "01000", + ErrSpBadselect: "0A000", + ErrSpBadreturn: "42000", + ErrSpBadstatement: "0A000", + ErrUpdateLogDeprecatedIgnored: "42000", + ErrUpdateLogDeprecatedTranslated: "42000", + ErrQueryInterrupted: "70100", + ErrSpWrongNoOfArgs: "42000", + ErrSpCondMismatch: "42000", + ErrSpNoreturn: "42000", + ErrSpNoreturnend: "2F005", + ErrSpBadCursorQuery: "42000", + ErrSpBadCursorSelect: "42000", + ErrSpCursorMismatch: "42000", + ErrSpCursorAlreadyOpen: "24000", + ErrSpCursorNotOpen: "24000", + ErrSpUndeclaredVar: "42000", + ErrSpFetchNoData: "02000", + ErrSpDupParam: "42000", + ErrSpDupVar: "42000", + ErrSpDupCond: "42000", + ErrSpDupCurs: "42000", + ErrSpSubselectNyi: "0A000", + ErrStmtNotAllowedInSfOrTrg: "0A000", + ErrSpVarcondAfterCurshndlr: "42000", + ErrSpCursorAfterHandler: "42000", + ErrSpCaseNotFound: "20000", + ErrDivisionByZero: "22012", + ErrIllegalValueForType: "22007", + ErrProcaccessDenied: "42000", + ErrXaerNota: "XAE04", + ErrXaerInval: "XAE05", + ErrXaerRmfail: "XAE07", + ErrXaerOutside: "XAE09", + ErrXaerRmerr: "XAE03", + ErrXaRbrollback: "XA100", + ErrNonexistingProcGrant: "42000", + ErrDataTooLong: "22001", + ErrSpBadSQLstate: "42000", + ErrCantCreateUserWithGrant: "42000", + ErrSpDupHandler: "42000", + ErrSpNotVarArg: "42000", + ErrSpNoRetset: "0A000", + ErrCantCreateGeometryObject: "22003", + ErrTooBigScale: "42000", + ErrTooBigPrecision: "42000", + ErrMBiggerThanD: "42000", + ErrTooLongBody: "42000", + ErrTooBigDisplaywidth: "42000", + ErrXaerDupid: "XAE08", + ErrDatetimeFunctionOverflow: "22008", + ErrRowIsReferenced2: "23000", + ErrNoReferencedRow2: "23000", + ErrSpBadVarShadow: "42000", + ErrSpWrongName: "42000", + ErrSpNoAggregate: "42000", + ErrMaxPreparedStmtCountReached: "42000", + ErrNonGroupingFieldUsed: "42000", + ErrForeignDuplicateKeyOldUnused: "23000", + ErrCantChangeTxCharacteristics: "25001", + ErrWrongParamcountToNativeFct: "42000", + ErrWrongParametersToNativeFct: "42000", + ErrWrongParametersToStoredFct: "42000", + ErrDupEntryWithKeyName: "23000", + ErrXaRbtimeout: "XA106", + ErrXaRbdeadlock: "XA102", + ErrFuncInexistentNameCollision: "42000", + ErrDupSignalSet: "42000", + ErrSignalWarn: "01000", + ErrSignalNotFound: "02000", + ErrSignalException: "HY000", + ErrResignalWithoutActiveHandler: "0K000", + ErrSpatialMustHaveGeomCol: "42000", + ErrDataOutOfRange: "22003", + ErrAccessDeniedNoPassword: "28000", + ErrTruncateIllegalFk: "42000", + ErrDaInvalidConditionNumber: "35000", + ErrForeignDuplicateKeyWithChildInfo: "23000", + ErrForeignDuplicateKeyWithoutChildInfo: "23000", + ErrCantExecuteInReadOnlyTransaction: "25006", + ErrAlterOperationNotSupported: "0A000", + ErrAlterOperationNotSupportedReason: "0A000", + ErrDupUnknownInIndex: "23000", + ErrBadGeneratedColumn: "HY000", + ErrUnsupportedOnGeneratedColumn: "HY000", + ErrGeneratedColumnNonPrior: "HY000", + ErrDependentByGeneratedColumn: "HY000", + ErrInvalidJSONText: "22032", + ErrInvalidJSONPath: "42000", + ErrInvalidJSONData: "22032", + ErrInvalidJSONPathWildcard: "42000", + ErrJSONUsedAsKey: "42000", +} diff --git a/mysql/type.go b/mysql/type.go new file mode 100644 index 000000000..9ea32f90d --- /dev/null +++ b/mysql/type.go @@ -0,0 +1,155 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL type information. +const ( + TypeDecimal byte = 0 + TypeTiny byte = 1 + TypeShort byte = 2 + TypeLong byte = 3 + TypeFloat byte = 4 + TypeDouble byte = 5 + TypeNull byte = 6 + TypeTimestamp byte = 7 + TypeLonglong byte = 8 + TypeInt24 byte = 9 + TypeDate byte = 10 + /* TypeDuration original name was TypeTime, renamed to TypeDuration to resolve the conflict with Go type Time.*/ + TypeDuration byte = 11 + TypeDatetime byte = 12 + TypeYear byte = 13 + TypeNewDate byte = 14 + TypeVarchar byte = 15 + TypeBit byte = 16 + + TypeJSON byte = 0xf5 + TypeNewDecimal byte = 0xf6 + TypeEnum byte = 0xf7 + TypeSet byte = 0xf8 + TypeTinyBlob byte = 0xf9 + TypeMediumBlob byte = 0xfa + TypeLongBlob byte = 0xfb + TypeBlob byte = 0xfc + TypeVarString byte = 0xfd + TypeString byte = 0xfe + TypeGeometry byte = 0xff +) + +// TypeUnspecified is an uninitialized type. TypeDecimal is not used in MySQL. +const TypeUnspecified = TypeDecimal + +// Flag information. +const ( + NotNullFlag uint = 1 << 0 /* Field can't be NULL */ + PriKeyFlag uint = 1 << 1 /* Field is part of a primary key */ + UniqueKeyFlag uint = 1 << 2 /* Field is part of a unique key */ + MultipleKeyFlag uint = 1 << 3 /* Field is part of a key */ + BlobFlag uint = 1 << 4 /* Field is a blob */ + UnsignedFlag uint = 1 << 5 /* Field is unsigned */ + ZerofillFlag uint = 1 << 6 /* Field is zerofill */ + BinaryFlag uint = 1 << 7 /* Field is binary */ + EnumFlag uint = 1 << 8 /* Field is an enum */ + AutoIncrementFlag uint = 1 << 9 /* Field is an auto increment field */ + TimestampFlag uint = 1 << 10 /* Field is a timestamp */ + SetFlag uint = 1 << 11 /* Field is a set */ + NoDefaultValueFlag uint = 1 << 12 /* Field doesn't have a default value */ + OnUpdateNowFlag uint = 1 << 13 /* Field is set to NOW on UPDATE */ + PartKeyFlag uint = 1 << 14 /* Intern: Part of some keys */ + NumFlag uint = 1 << 15 /* Field is a num (for clients) */ + + GroupFlag uint = 1 << 15 /* Internal: Group field */ + UniqueFlag uint = 1 << 16 /* Internal: Used by sql_yacc */ + BinCmpFlag uint = 1 << 17 /* Internal: Used by sql_yacc */ + ParseToJSONFlag uint = 1 << 18 /* Internal: Used when we want to parse string to JSON in CAST */ + IsBooleanFlag uint = 1 << 19 /* Internal: Used for telling boolean literal from integer */ + PreventNullInsertFlag uint = 1 << 20 /* Prevent this Field from inserting NULL values */ +) + +// TypeInt24 bounds. +const ( + MaxUint24 = 1<<24 - 1 + MaxInt24 = 1<<23 - 1 + MinInt24 = -1 << 23 +) + +// HasNotNullFlag checks if NotNullFlag is set. +func HasNotNullFlag(flag uint) bool { + return (flag & NotNullFlag) > 0 +} + +// HasNoDefaultValueFlag checks if NoDefaultValueFlag is set. +func HasNoDefaultValueFlag(flag uint) bool { + return (flag & NoDefaultValueFlag) > 0 +} + +// HasAutoIncrementFlag checks if AutoIncrementFlag is set. +func HasAutoIncrementFlag(flag uint) bool { + return (flag & AutoIncrementFlag) > 0 +} + +// HasUnsignedFlag checks if UnsignedFlag is set. +func HasUnsignedFlag(flag uint) bool { + return (flag & UnsignedFlag) > 0 +} + +// HasZerofillFlag checks if ZerofillFlag is set. +func HasZerofillFlag(flag uint) bool { + return (flag & ZerofillFlag) > 0 +} + +// HasBinaryFlag checks if BinaryFlag is set. +func HasBinaryFlag(flag uint) bool { + return (flag & BinaryFlag) > 0 +} + +// HasPriKeyFlag checks if PriKeyFlag is set. +func HasPriKeyFlag(flag uint) bool { + return (flag & PriKeyFlag) > 0 +} + +// HasUniKeyFlag checks if UniqueKeyFlag is set. +func HasUniKeyFlag(flag uint) bool { + return (flag & UniqueKeyFlag) > 0 +} + +// HasMultipleKeyFlag checks if MultipleKeyFlag is set. +func HasMultipleKeyFlag(flag uint) bool { + return (flag & MultipleKeyFlag) > 0 +} + +// HasTimestampFlag checks if HasTimestampFlag is set. +func HasTimestampFlag(flag uint) bool { + return (flag & TimestampFlag) > 0 +} + +// HasOnUpdateNowFlag checks if OnUpdateNowFlag is set. +func HasOnUpdateNowFlag(flag uint) bool { + return (flag & OnUpdateNowFlag) > 0 +} + +// HasParseToJSONFlag checks if ParseToJSONFlag is set. +func HasParseToJSONFlag(flag uint) bool { + return (flag & ParseToJSONFlag) > 0 +} + +// HasIsBooleanFlag checks if IsBooleanFlag is set. +func HasIsBooleanFlag(flag uint) bool { + return (flag & IsBooleanFlag) > 0 +} + +// HasPreventNullInsertFlag checks if PreventNullInsertFlag is set. +func HasPreventNullInsertFlag(flag uint) bool { + return (flag & PreventNullInsertFlag) > 0 +} diff --git a/mysql/type_test.go b/mysql/type_test.go new file mode 100644 index 000000000..a5139b168 --- /dev/null +++ b/mysql/type_test.go @@ -0,0 +1,37 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testTypeSuite{}) + +type testTypeSuite struct{} + +func (s *testTypeSuite) TestFlags(c *C) { + c.Assert(HasNotNullFlag(NotNullFlag), IsTrue) + c.Assert(HasUniKeyFlag(UniqueKeyFlag), IsTrue) + c.Assert(HasNotNullFlag(NotNullFlag), IsTrue) + c.Assert(HasNoDefaultValueFlag(NoDefaultValueFlag), IsTrue) + c.Assert(HasAutoIncrementFlag(AutoIncrementFlag), IsTrue) + c.Assert(HasUnsignedFlag(UnsignedFlag), IsTrue) + c.Assert(HasZerofillFlag(ZerofillFlag), IsTrue) + c.Assert(HasBinaryFlag(BinaryFlag), IsTrue) + c.Assert(HasPriKeyFlag(PriKeyFlag), IsTrue) + c.Assert(HasMultipleKeyFlag(MultipleKeyFlag), IsTrue) + c.Assert(HasTimestampFlag(TimestampFlag), IsTrue) + c.Assert(HasOnUpdateNowFlag(OnUpdateNowFlag), IsTrue) +} diff --git a/mysql/util.go b/mysql/util.go new file mode 100644 index 000000000..312161c4c --- /dev/null +++ b/mysql/util.go @@ -0,0 +1,93 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +type lengthAndDecimal struct { + length int + decimal int +} + +// defaultLengthAndDecimal provides default Flen and Decimal for fields +// from CREATE TABLE when they are unspecified. +var defaultLengthAndDecimal = map[byte]lengthAndDecimal{ + TypeBit: {1, 0}, + TypeTiny: {4, 0}, + TypeShort: {6, 0}, + TypeInt24: {9, 0}, + TypeLong: {11, 0}, + TypeLonglong: {20, 0}, + TypeDouble: {22, -1}, + TypeFloat: {12, -1}, + TypeNewDecimal: {11, 0}, + TypeDuration: {10, 0}, + TypeDate: {10, 0}, + TypeTimestamp: {19, 0}, + TypeDatetime: {19, 0}, + TypeYear: {4, 0}, + TypeString: {1, 0}, + TypeVarchar: {5, 0}, + TypeVarString: {5, 0}, + TypeTinyBlob: {255, 0}, + TypeBlob: {65535, 0}, + TypeMediumBlob: {16777215, 0}, + TypeLongBlob: {4294967295, 0}, + TypeJSON: {4294967295, 0}, + TypeNull: {0, 0}, + TypeSet: {-1, 0}, + TypeEnum: {-1, 0}, +} + +// IsIntegerType indicate whether tp is an integer type. +func IsIntegerType(tp byte) bool { + switch tp { + case TypeTiny, TypeShort, TypeInt24, TypeLong, TypeLonglong: + return true + } + return false +} + +// GetDefaultFieldLengthAndDecimal returns the default display length (flen) and decimal length for column. +// Call this when no Flen assigned in ddl. +// or column value is calculated from an expression. +// For example: "select count(*) from t;", the column type is int64 and Flen in ResultField will be 21. +// See https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +func GetDefaultFieldLengthAndDecimal(tp byte) (flen int, decimal int) { + val, ok := defaultLengthAndDecimal[tp] + if ok { + return val.length, val.decimal + } + return -1, -1 +} + +// defaultLengthAndDecimal provides default Flen and Decimal for fields +// from CAST when they are unspecified. +var defaultLengthAndDecimalForCast = map[byte]lengthAndDecimal{ + TypeString: {0, -1}, // Flen & Decimal differs. + TypeDate: {10, 0}, + TypeDatetime: {19, 0}, + TypeNewDecimal: {11, 0}, + TypeDuration: {10, 0}, + TypeLonglong: {22, 0}, + TypeJSON: {4194304, 0}, // Flen differs. +} + +// GetDefaultFieldLengthAndDecimalForCast returns the default display length (flen) and decimal length for casted column +// when flen or decimal is not specified. +func GetDefaultFieldLengthAndDecimalForCast(tp byte) (flen int, decimal int) { + val, ok := defaultLengthAndDecimalForCast[tp] + if ok { + return val.length, val.decimal + } + return -1, -1 +} diff --git a/opcode/opcode.go b/opcode/opcode.go new file mode 100644 index 000000000..670fb2b88 --- /dev/null +++ b/opcode/opcode.go @@ -0,0 +1,138 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "fmt" + "io" +) + +// Op is opcode type. +type Op int + +// List operators. +const ( + LogicAnd Op = iota + 1 + LeftShift + RightShift + LogicOr + GE + LE + EQ + NE + LT + GT + Plus + Minus + And + Or + Mod + Xor + Div + Mul + Not + BitNeg + IntDiv + LogicXor + NullEQ + In + Like + Case + Regexp + IsNull + IsTruth + IsFalsity +) + +// Ops maps opcode to string. +var Ops = map[Op]string{ + LogicAnd: "and", + LogicOr: "or", + LogicXor: "xor", + LeftShift: "leftshift", + RightShift: "rightshift", + GE: "ge", + LE: "le", + EQ: "eq", + NE: "ne", + LT: "lt", + GT: "gt", + Plus: "plus", + Minus: "minus", + And: "bitand", + Or: "bitor", + Mod: "mod", + Xor: "bitxor", + Div: "div", + Mul: "mul", + Not: "not", + BitNeg: "bitneg", + IntDiv: "intdiv", + NullEQ: "nulleq", + In: "in", + Like: "like", + Case: "case", + Regexp: "regexp", + IsNull: "isnull", + IsTruth: "istrue", + IsFalsity: "isfalse", +} + +// String implements Stringer interface. +func (o Op) String() string { + str, ok := Ops[o] + if !ok { + panic(fmt.Sprintf("%d", o)) + } + + return str +} + +var opsLiteral = map[Op]string{ + LogicAnd: "&&", + LogicOr: "||", + LogicXor: "^", + LeftShift: "<<", + RightShift: ">>", + GE: ">=", + LE: "<=", + EQ: "==", + NE: "!=", + LT: "<", + GT: ">", + Plus: "+", + Minus: "-", + And: "&", + Or: "|", + Mod: "%", + Xor: "^", + Div: "/", + Mul: "*", + Not: "!", + BitNeg: "~", + IntDiv: "DIV", + NullEQ: "<=>", + In: "IN", + Like: "LIKE", + Case: "CASE", + Regexp: "REGEXP", + IsNull: "IS NULL", + IsTruth: "IS TRUE", + IsFalsity: "IS FALSE", +} + +// Format the ExprNode into a Writer. +func (o Op) Format(w io.Writer) { + fmt.Fprintf(w, "%s", opsLiteral[o]) +} diff --git a/opcode/opcode_test.go b/opcode/opcode_test.go new file mode 100644 index 000000000..a4c2821b2 --- /dev/null +++ b/opcode/opcode_test.go @@ -0,0 +1,49 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "bytes" + "testing" +) + +func TestT(t *testing.T) { + op := Plus + if op.String() != "plus" { + t.Fatalf("invalid op code") + } + + if len(Ops) != len(opsLiteral) { + t.Error("inconsistent count ops and opsliteral") + } + var buf bytes.Buffer + for op := range Ops { + op.Format(&buf) + if buf.String() != opsLiteral[op] { + t.Error("format op fail", op) + } + buf.Reset() + } + + // Test invalid opcode + defer func() { + recover() + }() + + op = 0 + s := op.String() + if len(s) > 0 { + t.Fail() + } +} diff --git a/parser.y b/parser.y new file mode 100644 index 000000000..ff2469a67 --- /dev/null +++ b/parser.y @@ -0,0 +1,7207 @@ +%{ +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import ( + "strings" + + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/types" +) + +%} + +%union { + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +%token + /*yy:token "%c" */ identifier "identifier" + /*yy:token "_%c" */ underscoreCS "UNDERSCORE_CHARSET" + /*yy:token "\"%c\"" */ stringLit "string literal" + singleAtIdentifier "identifier with single leading at" + doubleAtIdentifier "identifier with double leading at" + invalid "a special token never used by parser, used by lexer to indicate error" + hintBegin "hintBegin is a virtual token for optimizer hint grammar" + hintEnd "hintEnd is a virtual token for optimizer hint grammar" + andand "&&" + pipes "||" + + /* The following tokens belong to ODBCDateTimeType. */ + odbcDateType "d" + odbcTimeType "t" + odbcTimestampType "ts" + + /* The following tokens belong to ReservedKeyword. */ + add "ADD" + all "ALL" + alter "ALTER" + analyze "ANALYZE" + and "AND" + as "AS" + asc "ASC" + between "BETWEEN" + bigIntType "BIGINT" + binaryType "BINARY" + blobType "BLOB" + both "BOTH" + by "BY" + cascade "CASCADE" + caseKwd "CASE" + change "CHANGE" + character "CHARACTER" + charType "CHAR" + check "CHECK" + collate "COLLATE" + column "COLUMN" + constraint "CONSTRAINT" + convert "CONVERT" + create "CREATE" + cross "CROSS" + currentDate "CURRENT_DATE" + currentTime "CURRENT_TIME" + currentTs "CURRENT_TIMESTAMP" + currentUser "CURRENT_USER" + database "DATABASE" + databases "DATABASES" + dayHour "DAY_HOUR" + dayMicrosecond "DAY_MICROSECOND" + dayMinute "DAY_MINUTE" + daySecond "DAY_SECOND" + decimalType "DECIMAL" + defaultKwd "DEFAULT" + delayed "DELAYED" + deleteKwd "DELETE" + desc "DESC" + describe "DESCRIBE" + distinct "DISTINCT" + distinctRow "DISTINCTROW" + div "DIV" + doubleType "DOUBLE" + drop "DROP" + dual "DUAL" + elseKwd "ELSE" + enclosed "ENCLOSED" + escaped "ESCAPED" + exists "EXISTS" + explain "EXPLAIN" + falseKwd "FALSE" + floatType "FLOAT" + forKwd "FOR" + force "FORCE" + foreign "FOREIGN" + from "FROM" + fulltext "FULLTEXT" + generated "GENERATED" + grant "GRANT" + group "GROUP" + having "HAVING" + highPriority "HIGH_PRIORITY" + hourMicrosecond "HOUR_MICROSECOND" + hourMinute "HOUR_MINUTE" + hourSecond "HOUR_SECOND" + ifKwd "IF" + ignore "IGNORE" + in "IN" + index "INDEX" + infile "INFILE" + inner "INNER" + integerType "INTEGER" + interval "INTERVAL" + into "INTO" + is "IS" + insert "INSERT" + intType "INT" + int1Type "INT1" + int2Type "INT2" + int3Type "INT3" + int4Type "INT4" + int8Type "INT8" + join "JOIN" + key "KEY" + keys "KEYS" + kill "KILL" + leading "LEADING" + left "LEFT" + like "LIKE" + limit "LIMIT" + lines "LINES" + load "LOAD" + localTime "LOCALTIME" + localTs "LOCALTIMESTAMP" + lock "LOCK" + longblobType "LONGBLOB" + longtextType "LONGTEXT" + lowPriority "LOW_PRIORITY" + maxValue "MAXVALUE" + mediumblobType "MEDIUMBLOB" + mediumIntType "MEDIUMINT" + mediumtextType "MEDIUMTEXT" + minuteMicrosecond "MINUTE_MICROSECOND" + minuteSecond "MINUTE_SECOND" + mod "MOD" + not "NOT" + noWriteToBinLog "NO_WRITE_TO_BINLOG" + null "NULL" + numericType "NUMERIC" + nvarcharType "NVARCHAR" + on "ON" + option "OPTION" + or "OR" + order "ORDER" + outer "OUTER" + packKeys "PACK_KEYS" + partition "PARTITION" + precisionType "PRECISION" + primary "PRIMARY" + procedure "PROCEDURE" + shardRowIDBits "SHARD_ROW_ID_BITS" + rangeKwd "RANGE" + read "READ" + realType "REAL" + references "REFERENCES" + regexpKwd "REGEXP" + rename "RENAME" + repeat "REPEAT" + replace "REPLACE" + restrict "RESTRICT" + revoke "REVOKE" + right "RIGHT" + rlike "RLIKE" + secondMicrosecond "SECOND_MICROSECOND" + selectKwd "SELECT" + set "SET" + show "SHOW" + smallIntType "SMALLINT" + sql "SQL" + sqlCalcFoundRows "SQL_CALC_FOUND_ROWS" + starting "STARTING" + straightJoin "STRAIGHT_JOIN" + tableKwd "TABLE" + stored "STORED" + terminated "TERMINATED" + then "THEN" + tinyblobType "TINYBLOB" + tinyIntType "TINYINT" + tinytextType "TINYTEXT" + to "TO" + trailing "TRAILING" + trigger "TRIGGER" + trueKwd "TRUE" + unique "UNIQUE" + union "UNION" + unlock "UNLOCK" + unsigned "UNSIGNED" + update "UPDATE" + usage "USAGE" + use "USE" + using "USING" + utcDate "UTC_DATE" + utcTimestamp "UTC_TIMESTAMP" + utcTime "UTC_TIME" + values "VALUES" + long "LONG" + varcharType "VARCHAR" + varbinaryType "VARBINARY" + virtual "VIRTUAL" + when "WHEN" + where "WHERE" + write "WRITE" + with "WITH" + xor "XOR" + yearMonth "YEAR_MONTH" + zerofill "ZEROFILL" + natural "NATURAL" + + /* The following tokens belong to UnReservedKeyword. */ + action "ACTION" + after "AFTER" + always "ALWAYS" + algorithm "ALGORITHM" + any "ANY" + ascii "ASCII" + autoIncrement "AUTO_INCREMENT" + avgRowLength "AVG_ROW_LENGTH" + avg "AVG" + begin "BEGIN" + binlog "BINLOG" + bitType "BIT" + booleanType "BOOLEAN" + boolType "BOOL" + btree "BTREE" + byteType "BYTE" + cascaded "CASCADED" + charsetKwd "CHARSET" + checksum "CHECKSUM" + cleanup "CLEANUP" + client "CLIENT" + coalesce "COALESCE" + collation "COLLATION" + columns "COLUMNS" + comment "COMMENT" + commit "COMMIT" + committed "COMMITTED" + compact "COMPACT" + compressed "COMPRESSED" + compression "COMPRESSION" + connection "CONNECTION" + consistent "CONSISTENT" + day "DAY" + data "DATA" + dateType "DATE" + datetimeType "DATETIME" + deallocate "DEALLOCATE" + definer "DEFINER" + delayKeyWrite "DELAY_KEY_WRITE" + disable "DISABLE" + do "DO" + duplicate "DUPLICATE" + dynamic "DYNAMIC" + enable "ENABLE" + end "END" + engine "ENGINE" + engines "ENGINES" + enum "ENUM" + event "EVENT" + events "EVENTS" + escape "ESCAPE" + exclusive "EXCLUSIVE" + execute "EXECUTE" + fields "FIELDS" + first "FIRST" + fixed "FIXED" + flush "FLUSH" + format "FORMAT" + full "FULL" + function "FUNCTION" + grants "GRANTS" + hash "HASH" + hour "HOUR" + identified "IDENTIFIED" + isolation "ISOLATION" + indexes "INDEXES" + invoker "INVOKER" + jsonType "JSON" + keyBlockSize "KEY_BLOCK_SIZE" + local "LOCAL" + less "LESS" + level "LEVEL" + master "MASTER" + microsecond "MICROSECOND" + minute "MINUTE" + mode "MODE" + modify "MODIFY" + month "MONTH" + maxRows "MAX_ROWS" + maxConnectionsPerHour "MAX_CONNECTIONS_PER_HOUR" + maxQueriesPerHour "MAX_QUERIES_PER_HOUR" + maxUpdatesPerHour "MAX_UPDATES_PER_HOUR" + maxUserConnections "MAX_USER_CONNECTIONS" + merge "MERGE" + minRows "MIN_ROWS" + names "NAMES" + national "NATIONAL" + no "NO" + none "NONE" + offset "OFFSET" + only "ONLY" + password "PASSWORD" + partitions "PARTITIONS" + pipesAsOr + plugins "PLUGINS" + prepare "PREPARE" + privileges "PRIVILEGES" + process "PROCESS" + processlist "PROCESSLIST" + profiles "PROFILES" + quarter "QUARTER" + query "QUERY" + queries "QUERIES" + quick "QUICK" + recover "RECOVER" + redundant "REDUNDANT" + reload "RELOAD" + repeatable "REPEATABLE" + replication "REPLICATION" + reverse "REVERSE" + rollback "ROLLBACK" + routine "ROUTINE" + row "ROW" + rowCount "ROW_COUNT" + rowFormat "ROW_FORMAT" + second "SECOND" + security "SECURITY" + separator "SEPARATOR" + serializable "SERIALIZABLE" + session "SESSION" + share "SHARE" + shared "SHARED" + signed "SIGNED" + slave "SLAVE" + slow "SLOW" + snapshot "SNAPSHOT" + sqlCache "SQL_CACHE" + sqlNoCache "SQL_NO_CACHE" + start "START" + statsPersistent "STATS_PERSISTENT" + status "STATUS" + subpartition "SUBPARTITION" + subpartitions "SUBPARTITIONS" + super "SUPER" + some "SOME" + global "GLOBAL" + tables "TABLES" + tablespace "TABLESPACE" + temporary "TEMPORARY" + temptable "TEMPTABLE" + textType "TEXT" + than "THAN" + timeType "TIME" + timestampType "TIMESTAMP" + trace "TRACE" + transaction "TRANSACTION" + triggers "TRIGGERS" + truncate "TRUNCATE" + uncommitted "UNCOMMITTED" + unknown "UNKNOWN" + user "USER" + undefined "UNDEFINED" + value "VALUE" + variables "VARIABLES" + view "VIEW" + warnings "WARNINGS" + identSQLErrors "ERRORS" + week "WEEK" + yearType "YEAR" + + /* The following tokens belong to NotKeywordToken. */ + addDate "ADDDATE" + bitAnd "BIT_AND" + bitOr "BIT_OR" + bitXor "BIT_XOR" + cast "CAST" + copyKwd "COPY" + count "COUNT" + curTime "CURTIME" + dateAdd "DATE_ADD" + dateSub "DATE_SUB" + extract "EXTRACT" + getFormat "GET_FORMAT" + groupConcat "GROUP_CONCAT" + inplace "INPLACE" + internal "INTERNAL" + min "MIN" + max "MAX" + maxExecutionTime "MAX_EXECUTION_TIME" + now "NOW" + position "POSITION" + recent "RECENT" + subDate "SUBDATE" + sum "SUM" + substring "SUBSTRING" + timestampAdd "TIMESTAMPADD" + timestampDiff "TIMESTAMPDIFF" + top "TOP" + trim "TRIM" + + /* The following tokens belong to TiDBKeyword. */ + admin "ADMIN" + buckets "BUCKETS" + cancel "CANCEL" + ddl "DDL" + jobs "JOBS" + job "JOB" + stats "STATS" + statsMeta "STATS_META" + statsHistograms "STATS_HISTOGRAMS" + statsBuckets "STATS_BUCKETS" + statsHealthy "STATS_HEALTHY" + tidb "TIDB" + tidbHJ "TIDB_HJ" + tidbSMJ "TIDB_SMJ" + tidbINLJ "TIDB_INLJ" + + builtinAddDate + builtinBitAnd + builtinBitOr + builtinBitXor + builtinCast + builtinCount + builtinCurDate + builtinCurTime + builtinDateAdd + builtinDateSub + builtinExtract + builtinGroupConcat + builtinMax + builtinMin + builtinNow + builtinPosition + builtinStddevPop + builtinSubDate + builtinSubstring + builtinSum + builtinSysDate + builtinTrim + builtinUser + builtinVarPop + builtinVarSamp + +%token + + /*yy:token "1.%d" */ floatLit "floating-point literal" + /*yy:token "1.%d" */ decLit "decimal literal" + /*yy:token "%d" */ intLit "integer literal" + /*yy:token "%x" */ hexLit "hexadecimal literal" + /*yy:token "%b" */ bitLit "bit literal" + + andnot "&^" + assignmentEq ":=" + eq "=" + ge ">=" + le "<=" + jss "->" + juss "->>" + lsh "<<" + neq "!=" + neqSynonym "<>" + nulleq "<=>" + paramMarker "?" + rsh ">>" + +%token not2 + +%type + Expression "expression" + MaxValueOrExpression "maxvalue or expression" + BoolPri "boolean primary expression" + ExprOrDefault "expression or default" + PredicateExpr "Predicate expression factor" + SetExpr "Set variable statement value's expression" + BitExpr "bit expression" + SimpleExpr "simple expression" + SimpleIdent "Simple Identifier expression" + SumExpr "aggregate functions" + FunctionCallGeneric "Function call with Identifier" + FunctionCallKeyword "Function call with keyword as function name" + FunctionCallNonKeyword "Function call with nonkeyword as function name" + Literal "literal value" + Variable "User or system variable" + SystemVariable "System defined variable name" + UserVariable "User defined variable name" + SubSelect "Sub Select" + StringLiteral "text literal" + ExpressionOpt "Optional expression" + SignedLiteral "Literal or NumLiteral with sign" + DefaultValueExpr "DefaultValueExpr(Now or Signed Literal)" + NowSymOptionFraction "NowSym with optional fraction part" + +%type + AdminStmt "Check table statement or show ddl statement" + AlterTableStmt "Alter table statement" + AlterUserStmt "Alter user statement" + AnalyzeTableStmt "Analyze table statement" + BeginTransactionStmt "BEGIN TRANSACTION statement" + BinlogStmt "Binlog base64 statement" + CommitStmt "COMMIT statement" + CreateTableStmt "CREATE TABLE statement" + CreateViewStmt "CREATE VIEW stetement" + CreateUserStmt "CREATE User statement" + CreateDatabaseStmt "Create Database Statement" + CreateIndexStmt "CREATE INDEX statement" + DoStmt "Do statement" + DropDatabaseStmt "DROP DATABASE statement" + DropIndexStmt "DROP INDEX statement" + DropStatsStmt "DROP STATS statement" + DropTableStmt "DROP TABLE statement" + DropUserStmt "DROP USER" + DropViewStmt "DROP VIEW statement" + DeallocateStmt "Deallocate prepared statement" + DeleteFromStmt "DELETE FROM statement" + EmptyStmt "empty statement" + ExecuteStmt "Execute statement" + ExplainStmt "EXPLAIN statement" + ExplainableStmt "explainable statement" + FlushStmt "Flush statement" + GrantStmt "Grant statement" + InsertIntoStmt "INSERT INTO statement" + KillStmt "Kill statement" + LoadDataStmt "Load data statement" + LoadStatsStmt "Load statistic statement" + LockTablesStmt "Lock tables statement" + PreparedStmt "PreparedStmt" + SelectStmt "SELECT statement" + RenameTableStmt "rename table statement" + ReplaceIntoStmt "REPLACE INTO statement" + RevokeStmt "Revoke statement" + RollbackStmt "ROLLBACK statement" + SetStmt "Set variable statement" + ShowStmt "Show engines/databases/tables/columns/warnings/status statement" + Statement "statement" + TraceStmt "TRACE statement" + TraceableStmt "traceable statment" + TruncateTableStmt "TRUNCATE TABLE statement" + UnlockTablesStmt "Unlock tables statement" + UpdateStmt "UPDATE statement" + UnionStmt "Union select state ment" + UseStmt "USE statement" + +%type + AdminShowSlow "Admin Show Slow statement" + AlterTableOptionListOpt "alter table option list opt" + AlterTableSpec "Alter table specification" + AlterTableSpecList "Alter table specification list" + AnyOrAll "Any or All for subquery" + Assignment "assignment" + AssignmentList "assignment list" + AssignmentListOpt "assignment list opt" + AuthOption "User auth option" + AuthString "Password string value" + OptionalBraces "optional braces" + CastType "Cast function target type" + CharsetName "Character set name" + ColumnDef "table column definition" + ColumnDefList "table column definition list" + ColumnName "column name" + ColumnNameList "column name list" + ColumnList "column list" + ColumnNameListOpt "column name list opt" + ColumnNameListOptWithBrackets "column name list opt with brackets" + ColumnSetValue "insert statement set value by column name" + ColumnSetValueList "insert statement set value by column name list" + CompareOp "Compare opcode" + ColumnOption "column definition option" + ColumnOptionList "column definition option list" + VirtualOrStored "indicate generated column is stored or not" + ColumnOptionListOpt "optional column definition option list" + Constraint "table constraint" + ConstraintElem "table constraint element" + ConstraintKeywordOpt "Constraint Keyword or empty" + CreateIndexStmtUnique "CREATE INDEX optional UNIQUE clause" + CreateTableOptionListOpt "create table option list opt" + CreateTableSelectOpt "Select/Union statement in CREATE TABLE ... SELECT" + DatabaseOption "CREATE Database specification" + DatabaseOptionList "CREATE Database specification list" + DatabaseOptionListOpt "CREATE Database specification list opt" + DBName "Database Name" + DistinctOpt "Explicit distinct option" + DefaultFalseDistinctOpt "Distinct option which defaults to false" + DefaultTrueDistinctOpt "Distinct option which defaults to true" + BuggyDefaultFalseDistinctOpt "Distinct option which accepts DISTINCT ALL and defaults to false" + Enclosed "Enclosed by" + EqOpt "= or empty" + EscapedTableRef "escaped table reference" + Escaped "Escaped by" + ExpressionList "expression list" + MaxValueOrExpressionList "maxvalue or expression list" + ExpressionListOpt "expression list opt" + FuncDatetimePrecListOpt "Function datetime precision list opt" + FuncDatetimePrecList "Function datetime precision list" + Field "field expression" + Fields "Fields clause" + FieldsTerminated "Fields terminated by" + FieldAsName "Field alias name" + FieldAsNameOpt "Field alias name opt" + FieldList "field expression list" + FlushOption "Flush option" + TableRefsClause "Table references clause" + FuncDatetimePrec "Function datetime precision" + GlobalScope "The scope of variable" + GroupByClause "GROUP BY clause" + HashString "Hashed string" + HavingClause "HAVING clause" + HandleRange "handle range" + HandleRangeList "handle range list" + IfExists "If Exists" + IfNotExists "If Not Exists" + IgnoreOptional "IGNORE or empty" + IndexColName "Index column name" + IndexColNameList "List of index column name" + IndexHint "index hint" + IndexHintList "index hint list" + IndexHintListOpt "index hint list opt" + IndexHintScope "index hint scope" + IndexHintType "index hint type" + IndexName "index name" + IndexNameList "index name list" + IndexOption "Index Option" + IndexOptionList "Index Option List or empty" + IndexType "index type" + IndexTypeOpt "Optional index type" + InsertValues "Rest part of INSERT/REPLACE INTO statement" + JoinTable "join table" + JoinType "join type" + KillOrKillTiDB "Kill or Kill TiDB" + LikeEscapeOpt "like escape option" + LikeTableWithOrWithoutParen "LIKE table_name or ( LIKE table_name )" + LimitClause "LIMIT clause" + LimitOption "Limit option could be integer or parameter marker." + Lines "Lines clause" + LinesTerminated "Lines terminated by" + LocalOpt "Local opt" + LockClause "Alter table lock clause" + MaxNumBuckets "Max number of buckets" + NumLiteral "Num/Int/Float/Decimal Literal" + NoWriteToBinLogAliasOpt "NO_WRITE_TO_BINLOG alias LOCAL or empty" + ObjectType "Grant statement object type" + OnDuplicateKeyUpdate "ON DUPLICATE KEY UPDATE value list" + DuplicateOpt "[IGNORE|REPLACE] in CREATE TABLE ... SELECT statement" + OptFull "Full or empty" + Order "ORDER BY clause optional collation specification" + OrderBy "ORDER BY clause" + OrReplace "or replace" + ByItem "BY item" + OrderByOptional "Optional ORDER BY clause optional" + ByList "BY list" + QuickOptional "QUICK or empty" + PartitionDefinition "Partition definition" + PartitionDefinitionList "Partition definition list" + PartitionDefinitionListOpt "Partition definition list option" + PartitionOpt "Partition option" + PartitionNameList "Partition name list" + PartitionNumOpt "PARTITION NUM option" + PartDefValuesOpt "VALUES {LESS THAN {(expr | value_list) | MAXVALUE} | IN {value_list}" + PartDefOptionsOpt "PartDefOptionList option" + PartDefOptionList "PartDefOption list" + PartDefOption "COMMENT [=] xxx | TABLESPACE [=] tablespace_name | ENGINE [=] xxx" + PasswordOpt "Password option" + ColumnPosition "Column position [First|After ColumnName]" + PrepareSQL "Prepare statement sql string" + PriorityOpt "Statement priority option" + PrivElem "Privilege element" + PrivElemList "Privilege element list" + PrivLevel "Privilege scope" + PrivType "Privilege type" + ReferDef "Reference definition" + OnDeleteOpt "optional ON DELETE clause" + OnUpdateOpt "optional ON UPDATE clause" + OptGConcatSeparator "optional GROUP_CONCAT SEPARATOR" + ReferOpt "reference option" + RowFormat "Row format option" + RowValue "Row value" + SelectLockOpt "FOR UPDATE or LOCK IN SHARE MODE," + SelectStmtCalcFoundRows "SELECT statement optional SQL_CALC_FOUND_ROWS" + SelectStmtSQLCache "SELECT statement optional SQL_CAHCE/SQL_NO_CACHE" + SelectStmtStraightJoin "SELECT statement optional STRAIGHT_JOIN" + SelectStmtFieldList "SELECT statement field list" + SelectStmtLimit "SELECT statement optional LIMIT clause" + SelectStmtOpts "Select statement options" + SelectStmtBasic "SELECT statement from constant value" + SelectStmtFromDual "SELECT statement from dual" + SelectStmtFromTable "SELECT statement from table" + SelectStmtGroup "SELECT statement optional GROUP BY clause" + ShowTargetFilterable "Show target that can be filtered by WHERE or LIKE" + ShowDatabaseNameOpt "Show tables/columns statement database name option" + ShowTableAliasOpt "Show table alias option" + ShowLikeOrWhereOpt "Show like or where clause option" + Starting "Starting by" + StatementList "statement list" + StatsPersistentVal "stats_persistent value" + StringName "string literal or identifier" + StringList "string list" + SubPartitionOpt "SubPartition option" + SubPartitionNumOpt "SubPartition NUM option" + Symbol "Constraint Symbol" + TableAsName "table alias name" + TableAsNameOpt "table alias name optional" + TableElement "table definition element" + TableElementList "table definition element list" + TableElementListOpt "table definition element list optional" + TableFactor "table factor" + TableLock "Table name and lock type" + TableLockList "Table lock list" + TableName "Table name" + TableNameList "Table name list" + TableNameListOpt "Table name list opt" + TableOption "create table option" + TableOptionList "create table option list" + TableRef "table reference" + TableRefs "table references" + TableToTable "rename table to table" + TableToTableList "rename table to table by list" + + TransactionChar "Transaction characteristic" + TransactionChars "Transaction characteristic list" + TrimDirection "Trim string direction" + UnionOpt "Union Option(empty/ALL/DISTINCT)" + UnionClauseList "Union select clause list" + UnionSelect "Union (select) item" + Username "Username" + UsernameList "UsernameList" + UserSpec "Username and auth option" + UserSpecList "Username and auth option list" + UserVariableList "User defined variable name list" + Values "values" + ValuesList "values list" + ValuesOpt "values optional" + VariableAssignment "set variable value" + VariableAssignmentList "set variable value list" + ViewAlgorithm "view algorithm" + ViewCheckOption "view check option" + ViewDefiner "view definer" + ViewName "view name" + ViewFieldList "create view statement field list" + ViewSQLSecurity "view sql security" + WhereClause "WHERE clause" + WhereClauseOptional "Optional WHERE clause" + WhenClause "When clause" + WhenClauseList "When clause list" + WithReadLockOpt "With Read Lock opt" + WithGrantOptionOpt "With Grant Option opt" + ElseOpt "Optional else clause" + Type "Types" + + BetweenOrNotOp "Between predicate" + IsOrNotOp "Is predicate" + InOrNotOp "In predicate" + LikeOrNotOp "Like predicate" + RegexpOrNotOp "Regexp predicate" + + NumericType "Numeric types" + IntegerType "Integer Types types" + BooleanType "Boolean Types types" + FixedPointType "Exact value types" + FloatingPointType "Approximate value types" + BitValueType "bit value types" + StringType "String types" + BlobType "Blob types" + TextType "Text types" + DateAndTimeType "Date and Time types" + + OptFieldLen "Field length or empty" + FieldLen "Field length" + FieldOpts "Field type definition option list" + FieldOpt "Field type definition option" + FloatOpt "Floating-point type option" + Precision "Floating-point precision option" + OptBinary "Optional BINARY" + OptBinMod "Optional BINARY mode" + OptCharset "Optional Character setting" + OptCollate "Optional Collate setting" + IgnoreLines "Ignore num(int) lines" + NUM "A number" + NumList "Some numbers" + LengthNum "Field length num(uint64)" + HintTableList "Table list in optimizer hint" + TableOptimizerHintOpt "Table level optimizer hint" + TableOptimizerHints "Table level optimizer hints" + TableOptimizerHintList "Table level optimizer hint list" + +%type + AsOpt "AS or EmptyString" + KeyOrIndex "{KEY|INDEX}" + ColumnKeywordOpt "Column keyword or empty" + PrimaryOpt "Optional primary keyword" + NowSym "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP" + NowSymFunc "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP/NOW" + DefaultKwdOpt "optional DEFAULT keyword" + DatabaseSym "DATABASE or SCHEMA" + ExplainSym "EXPLAIN or DESCRIBE or DESC" + RegexpSym "REGEXP or RLIKE" + IntoOpt "INTO or EmptyString" + ValueSym "Value or Values" + Varchar "{NATIONAL VARCHAR|VARCHAR|NVARCHAR}" + TimeUnit "Time unit for 'DATE_ADD', 'DATE_SUB', 'ADDDATE', 'SUBDATE', 'EXTRACT'" + TimestampUnit "Time unit for 'TIMESTAMPADD' and 'TIMESTAMPDIFF'" + DeallocateSym "Deallocate or drop" + OuterOpt "optional OUTER clause" + CrossOpt "Cross join option" + TablesTerminalSym "{TABLE|TABLES}" + IsolationLevel "Isolation level" + ShowIndexKwd "Show index/indexs/key keyword" + DistinctKwd "DISTINCT/DISTINCTROW keyword" + FromOrIn "From or In" + OptTable "Optional table keyword" + OptInteger "Optional Integer keyword" + NationalOpt "National option" + CharsetKw "charset or charater set" + CommaOpt "optional comma" + LockType "Table locks type" + logAnd "logical and operator" + logOr "logical or operator" + FieldsOrColumns "Fields or columns" + GetFormatSelector "{DATE|DATETIME|TIME|TIMESTAMP}" + +%type + ODBCDateTimeType "ODBC type keywords for date and time literals" + Identifier "identifier or unreserved keyword" + NotKeywordToken "Tokens not mysql keyword but treated specially" + UnReservedKeyword "MySQL unreserved keywords" + TiDBKeyword "TiDB added keywords" + FunctionNameConflict "Built-in function call names which are conflict with keywords" + FunctionNameOptionalBraces "Function with optional braces, all of them are reserved keywords." + FunctionNameDatetimePrecision "Function with optional datetime precision, all of them are reserved keywords." + FunctionNameDateArith "Date arith function call names (date_add or date_sub)" + FunctionNameDateArithMultiForms "Date arith function call names (adddate or subdate)" + +%precedence empty + +%precedence sqlCache sqlNoCache +%precedence lowerThanIntervalKeyword +%precedence interval +%precedence lowerThanStringLitToken +%precedence stringLit +%precedence lowerThanSetKeyword +%precedence set +%precedence lowerThanInsertValues +%precedence insertValues +%precedence lowerThanCreateTableSelect +%precedence createTableSelect +%precedence lowerThanKey +%precedence key + +%left join straightJoin inner cross left right full natural +/* A dummy token to force the priority of TableRef production in a join. */ +%left tableRefPriority +%precedence lowerThanOn +%precedence on using +%right assignmentEq +%left pipes or pipesAsOr +%left xor +%left andand and +%left between +%precedence lowerThanEq +%left eq ge le neq neqSynonym '>' '<' is like in +%left '|' +%left '&' +%left rsh lsh +%left '-' '+' +%left '*' '/' '%' div mod +%left '^' +%left '~' neg +%right not not2 +%right collate + +%precedence '(' +%precedence quick +%precedence escape +%precedence lowerThanComma +%precedence ',' +%precedence higherThanComma + +%start Start + +%% + +Start: + StatementList + +/**************************************AlterTableStmt*************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html + *******************************************************************************************/ +AlterTableStmt: + "ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecList + { + $$ = &ast.AlterTableStmt{ + Table: $4.(*ast.TableName), + Specs: $5.([]*ast.AlterTableSpec), + } + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, PartitionNames: $7.([]model.CIStr), MaxNumBuckets: $8.(uint64),} + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$4.(*ast.TableName)}, + PartitionNames: $7.([]model.CIStr), + IndexNames: $9.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: $10.(uint64), + } + } + +AlterTableSpec: + AlterTableOptionListOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options:$1.([]*ast.TableOption), + } + } +| "CONVERT" "TO" CharsetKw CharsetName OptCollate + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options:[]*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: $4.(string)}}, + } + if $5 != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: $5.(string)}) + } + $$ = op + } +| "ADD" ColumnKeywordOpt ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)}, + Position: $4.(*ast.ColumnPosition), + } + } +| "ADD" ColumnKeywordOpt '(' ColumnDefList ')' + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: $4.([]*ast.ColumnDef), + } + } +| "ADD" Constraint + { + constraint := $2.(*ast.Constraint) + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } +| "ADD" "PARTITION" PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $3 != nil { + defs = $3.([]*ast.PartitionDefinition) + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } +| "DROP" ColumnKeywordOpt ColumnName RestrictOrCascadeOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropColumn, + OldColumnName: $3.(*ast.ColumnName), + } + } +| "DROP" "PRIMARY" "KEY" + { + $$ = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } +| "DROP" "PARTITION" Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropPartition, + Name: $3, + } + } +| "DROP" KeyOrIndex Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropIndex, + Name: $3, + } + } +| "DROP" "FOREIGN" "KEY" Symbol + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropForeignKey, + Name: $4.(string), + } + } +| "DISABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{} + } +| "ENABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{} + } +| "MODIFY" ColumnKeywordOpt ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)}, + Position: $4.(*ast.ColumnPosition), + } + } +| "CHANGE" ColumnKeywordOpt ColumnName ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableChangeColumn, + OldColumnName: $3.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)}, + Position: $5.(*ast.ColumnPosition), + } + } +| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" SignedLiteral + { + option := &ast.ColumnOption{Expr: $6} + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "ALTER" ColumnKeywordOpt ColumnName "DROP" "DEFAULT" + { + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "RENAME" "TO" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $2.(*ast.TableName), + } + } +| "RENAME" "AS" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" KeyOrIndex Identifier "TO" Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: model.NewCIStr($3), + ToKey: model.NewCIStr($5), + } + } +| LockClause + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: $1.(ast.LockType), + } + } +| "ALGORITHM" EqOpt AlterAlgorithm + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + } + } +| "FORCE" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } + + +AlterAlgorithm: + "DEFAULT" | "INPLACE" | "COPY" + +LockClauseOpt: + {} +| LockClause {} + +LockClause: + "LOCK" eq "NONE" + { + $$ = ast.LockTypeNone + } +| "LOCK" eq "DEFAULT" + { + $$ = ast.LockTypeDefault + } +| "LOCK" eq "SHARED" + { + $$ = ast.LockTypeShared + } +| "LOCK" eq "EXCLUSIVE" + { + $$ = ast.LockTypeExclusive + } + +KeyOrIndex: "KEY" | "INDEX" + + +KeyOrIndexOpt: + {} +| KeyOrIndex + +ColumnKeywordOpt: + {} +| "COLUMN" + +ColumnPosition: + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } +| "FIRST" + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } +| "AFTER" ColumnName + { + $$ = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: $2.(*ast.ColumnName), + } + } + +AlterTableSpecList: + AlterTableSpec + { + $$ = []*ast.AlterTableSpec{$1.(*ast.AlterTableSpec)} + } +| AlterTableSpecList ',' AlterTableSpec + { + $$ = append($1.([]*ast.AlterTableSpec), $3.(*ast.AlterTableSpec)) + } + +PartitionNameList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| PartitionNameList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +ConstraintKeywordOpt: + { + $$ = nil + } +| "CONSTRAINT" + { + $$ = nil + } +| "CONSTRAINT" Symbol + { + $$ = $2.(string) + } + +Symbol: + Identifier + { + $$ = $1 + } + +/**************************************RenameTableStmt*************************************** + * See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html + * + * TODO: refactor this when you are going to add full support for multiple schema changes. + * Currently it is only useful for syncer which depends heavily on tidb parser to do some dirty work. + *******************************************************************************************/ +RenameTableStmt: + "RENAME" "TABLE" TableToTableList + { + $$ = &ast.RenameTableStmt{ + OldTable: $3.([]*ast.TableToTable)[0].OldTable, + NewTable: $3.([]*ast.TableToTable)[0].NewTable, + TableToTables: $3.([]*ast.TableToTable), + } + } + +TableToTableList: + TableToTable + { + $$ = []*ast.TableToTable{$1.(*ast.TableToTable)} + } +| TableToTableList ',' TableToTable + { + $$ = append($1.([]*ast.TableToTable), $3.(*ast.TableToTable)) + } + +TableToTable: + TableName "TO" TableName + { + $$ = &ast.TableToTable{ + OldTable: $1.(*ast.TableName), + NewTable: $3.(*ast.TableName), + } + } + + +/*******************************************************************************************/ + +AnalyzeTableStmt: + "ANALYZE" "TABLE" TableNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), MaxNumBuckets: $4.(uint64)} + } +| "ANALYZE" "TABLE" TableName "INDEX" IndexNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, IndexNames: $5.([]model.CIStr), IndexFlag: true, MaxNumBuckets: $6.(uint64)} + } +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), MaxNumBuckets: $6.(uint64),} + } +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList MaxNumBuckets + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{$3.(*ast.TableName)}, + PartitionNames: $5.([]model.CIStr), + IndexNames: $7.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: $8.(uint64), + } + } + +MaxNumBuckets: + { + $$ = uint64(0) + } +| "WITH" NUM "BUCKETS" + { + $$ = getUint64FromNUM($2) + } + +/*******************************************************************************************/ +Assignment: + ColumnName eq Expression + { + $$ = &ast.Assignment{Column: $1.(*ast.ColumnName), Expr:$3} + } + +AssignmentList: + Assignment + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| AssignmentList ',' Assignment + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +AssignmentListOpt: + /* EMPTY */ + { + $$ = []*ast.Assignment{} + } +| AssignmentList + +BeginTransactionStmt: + "BEGIN" + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" "WITH" "CONSISTENT" "SNAPSHOT" + { + $$ = &ast.BeginStmt{} + } + +BinlogStmt: + "BINLOG" stringLit + { + $$ = &ast.BinlogStmt{Str: $2} + } + +ColumnDefList: + ColumnDef + { + $$ = []*ast.ColumnDef{$1.(*ast.ColumnDef)} + } +| ColumnDefList ',' ColumnDef + { + $$ = append($1.([]*ast.ColumnDef), $3.(*ast.ColumnDef)) + } + +ColumnDef: + ColumnName Type ColumnOptionListOpt + { + $$ = &ast.ColumnDef{Name: $1.(*ast.ColumnName), Tp: $2.(*types.FieldType), Options: $3.([]*ast.ColumnOption)} + } + +ColumnName: + Identifier + { + $$ = &ast.ColumnName{Name: model.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnName{Table: model.NewCIStr($1), Name: model.NewCIStr($3)} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnName{Schema: model.NewCIStr($1), Table: model.NewCIStr($3), Name: model.NewCIStr($5)} + } + +ColumnNameList: + ColumnName + { + $$ = []*ast.ColumnName{$1.(*ast.ColumnName)} + } +| ColumnNameList ',' ColumnName + { + $$ = append($1.([]*ast.ColumnName), $3.(*ast.ColumnName)) + } + +ColumnNameListOpt: + /* EMPTY */ + { + $$ = []*ast.ColumnName{} + } +| ColumnNameList + { + $$ = $1.([]*ast.ColumnName) + } + +ColumnNameListOptWithBrackets: + /* EMPTY */ + { + $$ = []*ast.ColumnName{} + } +| '(' ColumnNameListOpt ')' + { + $$ = $2.([]*ast.ColumnName) + } + +CommitStmt: + "COMMIT" + { + $$ = &ast.CommitStmt{} + } + +PrimaryOpt: + {} +| "PRIMARY" + +ColumnOption: + "NOT" "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } +| "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } +| "AUTO_INCREMENT" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } +| PrimaryOpt "KEY" + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } +| "UNIQUE" %prec lowerThanKey + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "UNIQUE" "KEY" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "DEFAULT" DefaultValueExpr + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: $2} + } +| "ON" "UPDATE" NowSymOptionFraction + { + nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} + } +| "COMMENT" stringLit + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr($2)} + } +| "CHECK" '(' Expression ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + $$ = &ast.ColumnOption{} + } +| GeneratedAlways "AS" '(' Expression ')' VirtualOrStored + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := $4 + expr.SetText(parser.src[startOffset:endOffset]) + + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: $6.(bool), + } + } +| ReferDef + { + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: $1.(*ast.ReferenceDef), + } + } + +GeneratedAlways: | "GENERATED" "ALWAYS" + +VirtualOrStored: + { + $$ = false + } +| "VIRTUAL" + { + $$ = false + } +| "STORED" + { + $$ = true + } + +ColumnOptionList: + ColumnOption + { + $$ = []*ast.ColumnOption{$1.(*ast.ColumnOption)} + } +| ColumnOptionList ColumnOption + { + $$ = append($1.([]*ast.ColumnOption), $2.(*ast.ColumnOption)) + } + +ColumnOptionListOpt: + { + $$ = []*ast.ColumnOption{} + } +| ColumnOptionList + { + $$ = $1.([]*ast.ColumnOption) + } + +ConstraintElem: + "PRIMARY" "KEY" IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: $6.([]*ast.IndexColName), + } + if $8 != nil { + c.Option = $8.(*ast.IndexOption) + } + if $4 != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = $4.(model.IndexType) + } + $$ = c + } +| "FULLTEXT" KeyOrIndex IndexName '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: $5.([]*ast.IndexColName), + Name: $3.(string), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + $$ = c + } +| KeyOrIndex IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintIndex, + Keys: $5.([]*ast.IndexColName), + Name: $2.(string), + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + if $3 != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = $3.(model.IndexType) + } + $$ = c + } +| "UNIQUE" KeyOrIndexOpt IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: $6.([]*ast.IndexColName), + Name: $3.(string), + } + if $8 != nil { + c.Option = $8.(*ast.IndexOption) + } + if $4 != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = $4.(model.IndexType) + } + $$ = c + } +| "FOREIGN" "KEY" IndexName '(' IndexColNameList ')' ReferDef + { + $$ = &ast.Constraint{ + Tp: ast.ConstraintForeignKey, + Keys: $5.([]*ast.IndexColName), + Name: $3.(string), + Refer: $7.(*ast.ReferenceDef), + } + } + +ReferDef: + "REFERENCES" TableName '(' IndexColNameList ')' OnDeleteOpt OnUpdateOpt + { + var onDeleteOpt *ast.OnDeleteOpt + if $6 != nil { + onDeleteOpt = $6.(*ast.OnDeleteOpt) + } + var onUpdateOpt *ast.OnUpdateOpt + if $7 != nil { + onUpdateOpt = $7.(*ast.OnUpdateOpt) + } + $$ = &ast.ReferenceDef{ + Table: $2.(*ast.TableName), + IndexColNames: $4.([]*ast.IndexColName), + OnDelete: onDeleteOpt, + OnUpdate: onUpdateOpt, + } + } + +OnDeleteOpt: + { + $$ = &ast.OnDeleteOpt{} + } %prec lowerThanOn +| "ON" "DELETE" ReferOpt + { + $$ = &ast.OnDeleteOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +OnUpdateOpt: + { + $$ = &ast.OnUpdateOpt{} + } %prec lowerThanOn +| "ON" "UPDATE" ReferOpt + { + $$ = &ast.OnUpdateOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +ReferOpt: + "RESTRICT" + { + $$ = ast.ReferOptionRestrict + } +| "CASCADE" + { + $$ = ast.ReferOptionCascade + } +| "SET" "NULL" + { + $$ = ast.ReferOptionSetNull + } +| "NO" "ACTION" + { + $$ = ast.ReferOptionNoAction + } + +/* + * The DEFAULT clause specifies a default value for a column. + * With one exception, the default value must be a constant; + * it cannot be a function or an expression. This means, for example, + * that you cannot set the default for a date column to be the value of + * a function such as NOW() or CURRENT_DATE. The exception is that you + * can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP or DATETIME column. + * + * See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + * https://github.com/mysql/mysql-server/blob/5.7/sql/sql_yacc.yy#L6832 + */ +DefaultValueExpr: + NowSymOptionFraction | SignedLiteral + +NowSymOptionFraction: + NowSym + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' NUM ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + +/* +* See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_localtime +* TODO: Process other three keywords +*/ +NowSymFunc: + "CURRENT_TIMESTAMP" | "LOCALTIME" | "LOCALTIMESTAMP" | builtinNow +NowSym: + "CURRENT_TIMESTAMP" | "LOCALTIME" | "LOCALTIMESTAMP" + + +SignedLiteral: + Literal + { + $$ = ast.NewValueExpr($1) + } +| '+' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr($2)} + } +| '-' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr($2)} + } + +NumLiteral: + intLit +| floatLit +| decLit + + +CreateIndexStmt: + "CREATE" CreateIndexStmtUnique "INDEX" Identifier IndexTypeOpt "ON" TableName '(' IndexColNameList ')' IndexOptionList LockClauseOpt + { + var indexOption *ast.IndexOption + if $11 != nil { + indexOption = $11.(*ast.IndexOption) + if indexOption.Tp == model.IndexTypeInvalid { + if $5 != nil { + indexOption.Tp = $5.(model.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if $5 != nil { + indexOption.Tp = $5.(model.IndexType) + } + } + $$ = &ast.CreateIndexStmt{ + Unique: $2.(bool), + IndexName: $4, + Table: $7.(*ast.TableName), + IndexColNames: $9.([]*ast.IndexColName), + IndexOption: indexOption, + } + } + +CreateIndexStmtUnique: + { + $$ = false + } +| "UNIQUE" + { + $$ = true + } + +IndexColName: + ColumnName OptFieldLen Order + { + //Order is parsed but just ignored as MySQL did + $$ = &ast.IndexColName{Column: $1.(*ast.ColumnName), Length: $2.(int)} + } + +IndexColNameList: + IndexColName + { + $$ = []*ast.IndexColName{$1.(*ast.IndexColName)} + } +| IndexColNameList ',' IndexColName + { + $$ = append($1.([]*ast.IndexColName), $3.(*ast.IndexColName)) + } + + + +/******************************************************************* + * + * Create Database Statement + * CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name + * [create_specification] ... + * + * create_specification: + * [DEFAULT] CHARACTER SET [=] charset_name + * | [DEFAULT] COLLATE [=] collation_name + *******************************************************************/ +CreateDatabaseStmt: + "CREATE" DatabaseSym IfNotExists DBName DatabaseOptionListOpt + { + $$ = &ast.CreateDatabaseStmt{ + IfNotExists: $3.(bool), + Name: $4.(string), + Options: $5.([]*ast.DatabaseOption), + } + } + +DBName: + Identifier + { + $$ = $1 + } + +DatabaseOption: + DefaultKwdOpt CharsetKw EqOpt CharsetName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: $4.(string)} + } +| DefaultKwdOpt "COLLATE" EqOpt StringName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: $4.(string)} + } + +DatabaseOptionListOpt: + { + $$ = []*ast.DatabaseOption{} + } +| DatabaseOptionList + +DatabaseOptionList: + DatabaseOption + { + $$ = []*ast.DatabaseOption{$1.(*ast.DatabaseOption)} + } +| DatabaseOptionList DatabaseOption + { + $$ = append($1.([]*ast.DatabaseOption), $2.(*ast.DatabaseOption)) + } + +/******************************************************************* + * + * Create Table Statement + * + * Example: + * CREATE TABLE Persons + * ( + * P_Id int NOT NULL, + * LastName varchar(255) NOT NULL, + * FirstName varchar(255), + * Address varchar(255), + * City varchar(255), + * PRIMARY KEY (P_Id) + * ) + *******************************************************************/ + +CreateTableStmt: + "CREATE" "TABLE" IfNotExists TableName TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt + { + stmt := $5.(*ast.CreateTableStmt) + stmt.Table = $4.(*ast.TableName) + stmt.IfNotExists = $3.(bool) + stmt.Options = $6.([]*ast.TableOption) + if $7 != nil { + stmt.Partition = $7.(*ast.PartitionOptions) + } + stmt.OnDuplicate = $8.(ast.OnDuplicateCreateTableSelectType) + stmt.Select = $10.(*ast.CreateTableStmt).Select + $$ = stmt + } +| "CREATE" "TABLE" IfNotExists TableName LikeTableWithOrWithoutParen + { + $$ = &ast.CreateTableStmt{ + Table: $4.(*ast.TableName), + ReferTable: $5.(*ast.TableName), + IfNotExists: $3.(bool), + } + } + +DefaultKwdOpt: + {} +| "DEFAULT" + +PartitionOpt: + { + $$ = nil + } +| "PARTITION" "BY" "KEY" '(' ColumnNameList ')' PartitionNumOpt PartitionDefinitionListOpt + { + $$ = nil + } +| "PARTITION" "BY" "HASH" '(' Expression ')' PartitionNumOpt PartitionDefinitionListOpt + { + $$ = nil + } +| "PARTITION" "BY" "RANGE" '(' Expression ')' PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $9 != nil { + defs = $9.([]*ast.PartitionDefinition) + } + $$ = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + Expr: $5.(ast.ExprNode), + Definitions: defs, + } + } +| "PARTITION" "BY" "RANGE" "COLUMNS" '(' ColumnNameList ')' PartitionNumOpt PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $9 != nil { + defs = $9.([]*ast.PartitionDefinition) + } + $$ = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + ColumnNames: $6.([]*ast.ColumnName), + Definitions: defs, + } + } + +SubPartitionOpt: + {} +| "SUBPARTITION" "BY" "HASH" '(' Expression ')' SubPartitionNumOpt + {} +| "SUBPARTITION" "BY" "KEY" '(' ColumnNameList ')' SubPartitionNumOpt + {} + +SubPartitionNumOpt: + {} +| "SUBPARTITIONS" NUM + {} + +PartitionNumOpt: + {} +| "PARTITIONS" NUM + {} + +PartitionDefinitionListOpt: + /* empty */ %prec lowerThanCreateTableSelect + { + $$ = nil + } +| '(' PartitionDefinitionList ')' + { + $$ = $2.([]*ast.PartitionDefinition) + } + +PartitionDefinitionList: + PartitionDefinition + { + $$ = []*ast.PartitionDefinition{$1.(*ast.PartitionDefinition)} + } +| PartitionDefinitionList ',' PartitionDefinition + { + $$ = append($1.([]*ast.PartitionDefinition), $3.(*ast.PartitionDefinition)) + } + +PartitionDefinition: + "PARTITION" Identifier PartDefValuesOpt PartDefOptionsOpt + { + partDef := &ast.PartitionDefinition{ + Name: model.NewCIStr($2), + } + switch $3.(type) { + case []ast.ExprNode: + partDef.LessThan = $3.([]ast.ExprNode) + case ast.ExprNode: + partDef.LessThan = make([]ast.ExprNode, 1) + partDef.LessThan[0] = $3.(ast.ExprNode) + } + + if comment, ok := $4.(string); ok { + partDef.Comment = comment + } + $$ = partDef + } + +PartDefOptionsOpt: + { + $$ = nil + } +| PartDefOptionList + { + $$ = $1 + } + +PartDefOptionList: + PartDefOption + { + $$ = $1 + } +| PartDefOptionList PartDefOption + { + if $1 != nil { + $$ = $1 + } else { + $$ = $2 + } + } + +PartDefOption: + "COMMENT" EqOpt stringLit + { + $$ = $3 + } +| "ENGINE" EqOpt Identifier + { + $$ = nil + } +| "TABLESPACE" EqOpt Identifier + { + $$ = nil + } + + +PartDefValuesOpt: + { + $$ = nil + } +| "VALUES" "LESS" "THAN" "MAXVALUE" + { + $$ = &ast.MaxValueExpr{} + } +| "VALUES" "LESS" "THAN" '(' MaxValueOrExpressionList ')' + { + $$ = $5 + } + +DuplicateOpt: + { + $$ = ast.OnDuplicateCreateTableSelectError + } +| "IGNORE" + { + $$ = ast.OnDuplicateCreateTableSelectIgnore + } +| "REPLACE" + { + $$ = ast.OnDuplicateCreateTableSelectReplace + } + +AsOpt: + {} +| "AS" + {} + +CreateTableSelectOpt: + /* empty */ + { + $$ = &ast.CreateTableStmt{} + } +| + SelectStmt + { + $$ = &ast.CreateTableStmt{Select: $1} + } +| + UnionStmt + { + $$ = &ast.CreateTableStmt{Select: $1} + } +| + SubSelect %prec createTableSelect + // TODO: We may need better solution as issue #320. + { + $$ = &ast.CreateTableStmt{Select: $1} + } + +LikeTableWithOrWithoutParen: + "LIKE" TableName + { + $$ = $2 + } +| + '(' "LIKE" TableName ')' + { + $$ = $3 + } + +/******************************************************************* + * + * Create View Statement + * + * Example: + * CREATE VIEW OR REPLACE ALGORITHM = MERGE DEFINER="root@localhost" SQL SECURITY = definer view_name (col1,col2) + * as select Col1,Col2 from table WITH LOCAL CHECK OPTION + *******************************************************************/ +CreateViewStmt: + "CREATE" OrReplace ViewAlgorithm ViewDefiner ViewSQLSecurity "VIEW" ViewName ViewFieldList "AS" SelectStmt ViewCheckOption + { + startOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := $10.(*ast.SelectStmt) + selStmt.SetText(string(parser.src[startOffset:])) + x := &ast.CreateViewStmt { + OrReplace: $2.(bool), + ViewName: $7.(*ast.TableName), + Select: selStmt, + } + if $8 != nil{ + x.Cols = $8.([]model.CIStr) + } + $$ = x + } + +OrReplace: + { + $$ = false + } +| "OR" "REPLACE" + { + $$ = true + } + +ViewAlgorithm: + /* EMPTY */ + { + $$ = "UNDEFINED" + } +| "ALGORITHM" "=" "UNDEFINED" + { + $$ = strings.ToUpper($3) + } +| "ALGORITHM" "=" "MERGE" + { + $$ = strings.ToUpper($3) + } +| "ALGORITHM" "=" "TEMPTABLE" + { + $$ = strings.ToUpper($3) + } + +ViewDefiner: + /* EMPTY */ + { + $$ = nil + } +| "DEFINER" "=" Username + { + $$ = $3 + } + +ViewSQLSecurity: + /* EMPTY */ + { + $$ = "DEFINER" + } +| "SQL" "SECURITY" "DEFINER" + { + $$ = $3 + } +| "SQL" "SECURITY" "INVOKER" + { + $$ = $3 + } + +ViewName: + TableName + { + $$ = $1.(*ast.TableName) + } + +ViewFieldList: + /* Empty */ + { + $$ = nil + } +| '(' ColumnList ')' + { + $$ = $2.([]model.CIStr) + } + +ColumnList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| ColumnList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +ViewCheckOption: + /* EMPTY */ + { + $$ = nil + } +| "WITH" "CASCADED" "CHECK" "OPTION" + { + $$ = $2 + } +| "WITH" "LOCAL" "CHECK" "OPTION" + { + $$ = $2 + } + +/****************************************************************** + * Do statement + * See https://dev.mysql.com/doc/refman/5.7/en/do.html + ******************************************************************/ +DoStmt: + "DO" ExpressionList + { + $$ = &ast.DoStmt { + Exprs: $2.([]ast.ExprNode), + } + } + +/******************************************************************* + * + * Delete Statement + * + *******************************************************************/ +DeleteFromStmt: + "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableName IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause + { + // Single Table + tn := $7.(*ast.TableName) + tn.IndexHints = $8.([]*ast.IndexHint) + join := &ast.Join{Left: &ast.TableSource{Source: tn}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + } + if $9 != nil { + x.Where = $9.(ast.ExprNode) + } + if $10 != nil { + x.Order = $10.(*ast.OrderByClause) + } + if $11 != nil { + x.Limit = $11.(*ast.Limit) + } + + $$ = x + } +| "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional TableNameList "FROM" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: $6.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $8.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $9 != nil { + x.Where = $9.(ast.ExprNode) + } + $$ = x + } + +| "DELETE" TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional "FROM" TableNameList "USING" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: $7.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $9.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $10 != nil { + x.Where = $10.(ast.ExprNode) + } + $$ = x + } + +DatabaseSym: +"DATABASE" + +DropDatabaseStmt: + "DROP" DatabaseSym IfExists DBName + { + $$ = &ast.DropDatabaseStmt{IfExists: $3.(bool), Name: $4.(string)} + } + +DropIndexStmt: + "DROP" "INDEX" IfExists Identifier "ON" TableName + { + $$ = &ast.DropIndexStmt{IfExists: $3.(bool), IndexName: $4, Table: $6.(*ast.TableName)} + } + +DropTableStmt: + "DROP" TableOrTables TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{Tables: $3.([]*ast.TableName)} + } +| "DROP" TableOrTables "IF" "EXISTS" TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{IfExists: true, Tables: $5.([]*ast.TableName)} + } + +DropViewStmt: + "DROP" "VIEW" "IF" "EXISTS" TableNameList + { + $$ = &ast.DoStmt{} + } + +DropUserStmt: + "DROP" "USER" UsernameList + { + $$ = &ast.DropUserStmt{IfExists: false, UserList: $3.([]*auth.UserIdentity)} + } +| "DROP" "USER" "IF" "EXISTS" UsernameList + { + $$ = &ast.DropUserStmt{IfExists: true, UserList: $5.([]*auth.UserIdentity)} + } + +DropStatsStmt: + "DROP" "STATS" TableName + { + $$ = &ast.DropStatsStmt{Table: $3.(*ast.TableName)} + } + +RestrictOrCascadeOpt: + {} +| "RESTRICT" +| "CASCADE" + +TableOrTables: + "TABLE" +| "TABLES" + +EqOpt: + {} +| eq + +EmptyStmt: + /* EMPTY */ + { + $$ = nil + } + +TraceStmt: + "TRACE" TraceableStmt + { + $$ = &ast.TraceStmt{ + Stmt: $2, + Format: "row", + } + } + +ExplainSym: +"EXPLAIN" | "DESCRIBE" | "DESC" + +ExplainStmt: + ExplainSym TableName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + }, + } + } +| ExplainSym TableName ColumnName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + Column: $3.(*ast.ColumnName), + }, + } + } +| ExplainSym ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $2, + Format: "row", + } + } +| ExplainSym "FORMAT" "=" stringLit ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $5, + Format: $4, + } + } +| ExplainSym "ANALYZE" ExplainableStmt + { + $$ = &ast.ExplainStmt { + Stmt: $3, + Format: "row", + Analyze: true, + } + } + +LengthNum: + NUM + { + $$ = getUint64FromNUM($1) + } + +NUM: + intLit + +Expression: + singleAtIdentifier assignmentEq Expression %prec assignmentEq + { + v := $1 + v = strings.TrimPrefix(v, "@") + $$ = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $3, + } + } +| Expression logOr Expression %prec pipes + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: $1, R: $3} + } +| Expression "XOR" Expression %prec xor + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: $1, R: $3} + } +| Expression logAnd Expression %prec andand + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: $1, R: $3} + } +| "NOT" Expression %prec not + { + expr, ok := $2.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = true + $$ = $2 + } else { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } + } +| BoolPri IsOrNotOp trueKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr:$1, Not: !$2.(bool), True: int64(1)} + } +| BoolPri IsOrNotOp falseKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr:$1, Not: !$2.(bool), True: int64(0)} + } +| BoolPri IsOrNotOp "UNKNOWN" %prec is + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri + +MaxValueOrExpression: + "MAXVALUE" + { + $$ = &ast.MaxValueExpr{} + } +| Expression + { + $$ = $1 + } + + +logOr: + pipesAsOr +| "OR" + +logAnd: +"&&" | "AND" + +ExpressionList: + Expression + { + $$ = []ast.ExprNode{$1} + } +| ExpressionList ',' Expression + { + $$ = append($1.([]ast.ExprNode), $3) + } + +MaxValueOrExpressionList: + MaxValueOrExpression + { + $$ = []ast.ExprNode{$1} +} +| MaxValueOrExpressionList ',' MaxValueOrExpression +{ + $$ = append($1.([]ast.ExprNode), $3) + } + + +ExpressionListOpt: + { + $$ = []ast.ExprNode{} + } +| ExpressionList + +FuncDatetimePrecListOpt: + { + $$ = []ast.ExprNode{} + } +| FuncDatetimePrecList + { + $$ = $1 + } + +FuncDatetimePrecList: + intLit + { + expr := ast.NewValueExpr($1) + $$ = []ast.ExprNode{expr} + } + +BoolPri: + BoolPri IsOrNotOp "NULL" %prec is + { + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri CompareOp PredicateExpr %prec eq + { + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: $3} + } +| BoolPri CompareOp AnyOrAll SubSelect %prec eq + { + sq := $4.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.CompareSubqueryExpr{Op: $2.(opcode.Op), L: $1, R: sq, All: $3.(bool)} + } +| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr %prec assignmentEq + { + v := $3 + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $5, + } + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: variable} + } +| PredicateExpr + +CompareOp: + ">=" + { + $$ = opcode.GE + } +| '>' + { + $$ = opcode.GT + } +| "<=" + { + $$ = opcode.LE + } +| '<' + { + $$ = opcode.LT + } +| "!=" + { + $$ = opcode.NE + } +| "<>" + { + $$ = opcode.NE + } +| "=" + { + $$ = opcode.EQ + } +| "<=>" + { + $$ = opcode.NullEQ + } + +BetweenOrNotOp: + "BETWEEN" + { + $$ = true + } +| "NOT" "BETWEEN" + { + $$ = false + } + +IsOrNotOp: + "IS" + { + $$ = true + } +| "IS" "NOT" + { + $$ = false + } + +InOrNotOp: + "IN" + { + $$ = true + } +| "NOT" "IN" + { + $$ = false + } + +LikeOrNotOp: + "LIKE" + { + $$ = true + } +| "NOT" "LIKE" + { + $$ = false + } + +RegexpOrNotOp: + RegexpSym + { + $$ = true + } +| "NOT" RegexpSym + { + $$ = false + } + +AnyOrAll: + "ANY" + { + $$ = false + } +| "SOME" + { + $$ = false + } +| "ALL" + { + $$ = true + } + +PredicateExpr: + BitExpr InOrNotOp '(' ExpressionList ')' + { + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), List: $4.([]ast.ExprNode)} + } +| BitExpr InOrNotOp SubSelect + { + sq := $3.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), Sel: sq} + } +| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr + { + $$ = &ast.BetweenExpr{ + Expr: $1, + Left: $3, + Right: $5, + Not: !$2.(bool), + } + } +| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt + { + escape := $4.(string) + if len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } else if len(escape) == 0 { + escape = "\\" + } + $$ = &ast.PatternLikeExpr{ + Expr: $1, + Pattern: $3, + Not: !$2.(bool), + Escape: escape[0], + } + } +| BitExpr RegexpOrNotOp SimpleExpr + { + $$ = &ast.PatternRegexpExpr{Expr: $1, Pattern: $3, Not: !$2.(bool)} + } +| BitExpr + +RegexpSym: +"REGEXP" | "RLIKE" + +LikeEscapeOpt: + %prec empty + { + $$ = "\\" + } +| "ESCAPE" stringLit + { + $$ = $2 + } + +Field: + '*' + { + $$ = &ast.SelectField{WildCard: &ast.WildCardField{}} + } +| Identifier '.' '*' + { + wildCard := &ast.WildCardField{Table: model.NewCIStr($1)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Identifier '.' Identifier '.' '*' + { + wildCard := &ast.WildCardField{Schema: model.NewCIStr($1), Table: model.NewCIStr($3)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Expression FieldAsNameOpt + { + expr := $1 + asName := $2.(string) + $$ = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } +| '{' Identifier Expression '}' FieldAsNameOpt + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + expr := $3 + asName := $5.(string) + $$ = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + +FieldAsNameOpt: + /* EMPTY */ + { + $$ = "" + } +| FieldAsName + { + $$ = $1 + } + +FieldAsName: + Identifier + { + $$ = $1 + } +| "AS" Identifier + { + $$ = $2 + } +| stringLit + { + $$ = $1 + } +| "AS" stringLit + { + $$ = $2 + } + +FieldList: + Field + { + field := $1.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + $$ = []*ast.SelectField{field} + } +| FieldList ',' Field + { + + fl := $1.([]*ast.SelectField) + last := fl[len(fl)-1] + if last.Expr != nil && last.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-1]) + last.SetText(parser.src[last.Offset:lastEnd]) + } + newField := $3.(*ast.SelectField) + newField.Offset = parser.startOffset(&yyS[yypt]) + $$ = append(fl, newField) + } + +GroupByClause: + "GROUP" "BY" ByList + { + $$ = &ast.GroupByClause{Items: $3.([]*ast.ByItem)} + } + +HavingClause: + { + $$ = nil + } +| "HAVING" Expression + { + $$ = &ast.HavingClause{Expr: $2} + } + +IfExists: + { + $$ = false + } +| "IF" "EXISTS" + { + $$ = true + } + +IfNotExists: + { + $$ = false + } +| "IF" "NOT" "EXISTS" + { + $$ = true + } + + +IgnoreOptional: + { + $$ = false + } +| "IGNORE" + { + $$ = true + } + +IndexName: + { + $$ = "" + } +| Identifier + { + //"index name" + $$ = $1 + } + +IndexOptionList: + { + $$ = nil + } +| IndexOptionList IndexOption + { + // Merge the options + if $1 == nil { + $$ = $2 + } else { + opt1 := $1.(*ast.IndexOption) + opt2 := $2.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } + $$ = opt1 + } + } + + +IndexOption: + "KEY_BLOCK_SIZE" EqOpt LengthNum + { + $$ = &ast.IndexOption{ + // TODO bug should be fix here! + // KeyBlockSize: $1.(uint64), + } + } +| IndexType + { + $$ = &ast.IndexOption { + Tp: $1.(model.IndexType), + } + } +| "COMMENT" stringLit + { + $$ = &ast.IndexOption { + Comment: $2, + } + } + +IndexType: + "USING" "BTREE" + { + $$ = model.IndexTypeBtree + } +| "USING" "HASH" + { + $$ = model.IndexTypeHash + } + +IndexTypeOpt: + { + $$ = nil + } +| IndexType + { + $$ = $1 + } + +/**********************************Identifier********************************************/ +Identifier: +identifier | UnReservedKeyword | NotKeywordToken | TiDBKeyword + +UnReservedKeyword: + "ACTION" | "ASCII" | "AUTO_INCREMENT" | "AFTER" | "ALWAYS" | "AVG" | "BEGIN" | "BIT" | "BOOL" | "BOOLEAN" | "BTREE" | "BYTE" | "CLEANUP" | "CHARSET" +| "COLUMNS" | "COMMIT" | "COMPACT" | "COMPRESSED" | "CONSISTENT" | "DATA" | "DATE" %prec lowerThanStringLitToken| "DATETIME" | "DAY" | "DEALLOCATE" | "DO" | "DUPLICATE" +| "DYNAMIC"| "END" | "ENGINE" | "ENGINES" | "ENUM" | "ERRORS" | "ESCAPE" | "EXECUTE" | "FIELDS" | "FIRST" | "FIXED" | "FLUSH" | "FORMAT" | "FULL" |"GLOBAL" +| "HASH" | "HOUR" | "LESS" | "LOCAL" | "NAMES" | "OFFSET" | "PASSWORD" %prec lowerThanEq | "PREPARE" | "QUICK" | "REDUNDANT" +| "ROLLBACK" | "SESSION" | "SIGNED" | "SNAPSHOT" | "START" | "STATUS" | "SUBPARTITIONS" | "SUBPARTITION" | "TABLES" | "TABLESPACE" | "TEXT" | "THAN" | "TIME" %prec lowerThanStringLitToken +| "TIMESTAMP" %prec lowerThanStringLitToken | "TRACE" | "TRANSACTION" | "TRUNCATE" | "UNKNOWN" | "VALUE" | "WARNINGS" | "YEAR" | "MODE" | "WEEK" | "ANY" | "SOME" | "USER" | "IDENTIFIED" +| "COLLATION" | "COMMENT" | "AVG_ROW_LENGTH" | "CONNECTION" | "CHECKSUM" | "COMPRESSION" | "KEY_BLOCK_SIZE" | "MASTER" | "MAX_ROWS" +| "MIN_ROWS" | "NATIONAL" | "ROW" | "ROW_FORMAT" | "QUARTER" | "GRANTS" | "TRIGGERS" | "DELAY_KEY_WRITE" | "ISOLATION" | "JSON" +| "REPEATABLE" | "COMMITTED" | "UNCOMMITTED" | "ONLY" | "SERIALIZABLE" | "LEVEL" | "VARIABLES" | "SQL_CACHE" | "INDEXES" | "PROCESSLIST" +| "SQL_NO_CACHE" | "DISABLE" | "ENABLE" | "REVERSE" | "PRIVILEGES" | "NO" | "BINLOG" | "FUNCTION" | "VIEW" | "MODIFY" | "EVENTS" | "PARTITIONS" +| "NONE" | "SUPER" | "EXCLUSIVE" | "STATS_PERSISTENT" | "ROW_COUNT" | "COALESCE" | "MONTH" | "PROCESS" | "PROFILES" +| "MICROSECOND" | "MINUTE" | "PLUGINS" | "QUERY" | "QUERIES" | "SECOND" | "SEPARATOR" | "SHARE" | "SHARED" | "SLOW" | "MAX_CONNECTIONS_PER_HOUR" | "MAX_QUERIES_PER_HOUR" | "MAX_UPDATES_PER_HOUR" +| "MAX_USER_CONNECTIONS" | "REPLICATION" | "CLIENT" | "SLAVE" | "RELOAD" | "TEMPORARY" | "ROUTINE" | "EVENT" | "ALGORITHM" | "DEFINER" | "INVOKER" | "MERGE" | "TEMPTABLE" | "UNDEFINED" | "SECURITY" | "CASCADED" | "RECOVER" + + + +TiDBKeyword: +"ADMIN" | "BUCKETS" | "CANCEL" | "DDL" | "JOBS" | "JOB" | "STATS" | "STATS_META" | "STATS_HISTOGRAMS" | "STATS_BUCKETS" | "STATS_HEALTHY" | "TIDB" | "TIDB_HJ" | "TIDB_SMJ" | "TIDB_INLJ" + +NotKeywordToken: + "ADDDATE" | "BIT_AND" | "BIT_OR" | "BIT_XOR" | "CAST" | "COPY" | "COUNT" | "CURTIME" | "DATE_ADD" | "DATE_SUB" | "EXTRACT" | "GET_FORMAT" | "GROUP_CONCAT" | "INPLACE" | "INTERNAL" +|"MIN" | "MAX" | "MAX_EXECUTION_TIME" | "NOW" | "RECENT" | "POSITION" | "SUBDATE" | "SUBSTRING" | "SUM" | "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TOP" | "TRIM" + +/************************************************************************************ + * + * Insert Statements + * + * TODO: support PARTITION + **********************************************************************************/ +InsertIntoStmt: + "INSERT" PriorityOpt IgnoreOptional IntoOpt TableName InsertValues OnDuplicateKeyUpdate + { + x := $6.(*ast.InsertStmt) + x.Priority = $2.(mysql.PriorityEnum) + x.IgnoreErr = $3.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: $5.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if $7 != nil { + x.OnDuplicate = $7.([]*ast.Assignment) + } + $$ = x + } + +IntoOpt: + {} +| "INTO" + +InsertValues: + '(' ColumnNameListOpt ')' ValueSym ValuesList + { + $$ = &ast.InsertStmt{ + Columns: $2.([]*ast.ColumnName), + Lists: $5.([][]ast.ExprNode), + } + } +| '(' ColumnNameListOpt ')' SelectStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(*ast.SelectStmt)} + } +| '(' ColumnNameListOpt ')' '(' SelectStmt ')' + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $5.(*ast.SelectStmt)} + } +| '(' ColumnNameListOpt ')' UnionStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(*ast.UnionStmt)} + } +| ValueSym ValuesList %prec insertValues + { + $$ = &ast.InsertStmt{Lists: $2.([][]ast.ExprNode)} + } +| '(' SelectStmt ')' + { + $$ = &ast.InsertStmt{Select: $2.(*ast.SelectStmt)} + } +| SelectStmt + { + $$ = &ast.InsertStmt{Select: $1.(*ast.SelectStmt)} + } +| UnionStmt + { + $$ = &ast.InsertStmt{Select: $1.(*ast.UnionStmt)} + } +| "SET" ColumnSetValueList + { + $$ = &ast.InsertStmt{Setlist: $2.([]*ast.Assignment)} + } + +ValueSym: +"VALUE" | "VALUES" + +ValuesList: + RowValue + { + $$ = [][]ast.ExprNode{$1.([]ast.ExprNode)} + } +| ValuesList ',' RowValue + { + $$ = append($1.([][]ast.ExprNode), $3.([]ast.ExprNode)) + } + +RowValue: + '(' ValuesOpt ')' + { + $$ = $2 + } + +ValuesOpt: + { + $$ = []ast.ExprNode{} + } +| Values + +Values: + Values ',' ExprOrDefault + { + $$ = append($1.([]ast.ExprNode), $3) + } +| ExprOrDefault + { + $$ = []ast.ExprNode{$1} + } + +ExprOrDefault: + Expression +| "DEFAULT" + { + $$ = &ast.DefaultExpr{} + } + +ColumnSetValue: + ColumnName eq Expression + { + $$ = &ast.Assignment{ + Column: $1.(*ast.ColumnName), + Expr: $3, + } + } + +ColumnSetValueList: + { + $$ = []*ast.Assignment{} + } +| ColumnSetValue + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| ColumnSetValueList ',' ColumnSetValue + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +/* + * ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... + * See https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html + */ +OnDuplicateKeyUpdate: + { + $$ = nil + } +| "ON" "DUPLICATE" "KEY" "UPDATE" AssignmentList + { + $$ = $5 + } + +/***********************************Insert Statements END************************************/ + +/************************************************************************************ + * Replace Statements + * See https://dev.mysql.com/doc/refman/5.7/en/replace.html + * + * TODO: support PARTITION + **********************************************************************************/ +ReplaceIntoStmt: + "REPLACE" PriorityOpt IntoOpt TableName InsertValues + { + x := $5.(*ast.InsertStmt) + x.IsReplace = true + x.Priority = $2.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: $4.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + $$ = x + } + +/***********************************Replace Statements END************************************/ + +ODBCDateTimeType: + "d" + { + $$ = ast.DateLiteral + } +| "t" + { + $$ = ast.TimeLiteral + } +| "ts" + { + $$ = ast.TimestampLiteral + } + +Literal: + "FALSE" + { + $$ = ast.NewValueExpr(false) + } +| "NULL" + { + $$ = ast.NewValueExpr(nil) + } +| "TRUE" + { + $$ = ast.NewValueExpr(true) + } +| floatLit + { + $$ = ast.NewValueExpr($1) + } +| decLit + { + $$ = ast.NewValueExpr($1) + } +| intLit + { + $$ = ast.NewValueExpr($1) + } +| StringLiteral %prec lowerThanStringLitToken + { + $$ = $1 + } +| "UNDERSCORE_CHARSET" stringLit + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollation($1) + if err != nil { + yylex.Errorf("Get collation error for charset: %s", $1) + return 1 + } + expr := ast.NewValueExpr($2) + tp := expr.GetType() + tp.Charset = $1 + tp.Collate = co + if tp.Collate == charset.CollationBin { + tp.Flag |= mysql.BinaryFlag + } + $$ = expr + } +| hexLit + { + $$ = ast.NewValueExpr($1) + } +| bitLit + { + $$ = ast.NewValueExpr($1) + } + +StringLiteral: + stringLit + { + expr := ast.NewValueExpr($1) + $$ = expr + } +| StringLiteral stringLit + { + valExpr := $1.(ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit+$2) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + $$ = expr + } + + +OrderBy: + "ORDER" "BY" ByList + { + $$ = &ast.OrderByClause{Items: $3.([]*ast.ByItem)} + } + +ByList: + ByItem + { + $$ = []*ast.ByItem{$1.(*ast.ByItem)} + } +| ByList ',' ByItem + { + $$ = append($1.([]*ast.ByItem), $3.(*ast.ByItem)) + } + +ByItem: + Expression Order + { + expr := $1 + valueExpr, ok := expr.(ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + $$ = &ast.ByItem{Expr: expr, Desc: $2.(bool)} + } + +Order: + /* EMPTY */ + { + $$ = false // ASC by default + } +| "ASC" + { + $$ = false + } +| "DESC" + { + $$ = true + } + +OrderByOptional: + { + $$ = nil + } +| OrderBy + { + $$ = $1 + } + +BitExpr: + BitExpr '|' BitExpr %prec '|' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Or, L: $1, R: $3} + } +| BitExpr '&' BitExpr %prec '&' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.And, L: $1, R: $3} + } +| BitExpr "<<" BitExpr %prec lsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: $1, R: $3} + } +| BitExpr ">>" BitExpr %prec rsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: $1, R: $3} + } +| BitExpr '+' BitExpr %prec '+' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Plus, L: $1, R: $3} + } +| BitExpr '-' BitExpr %prec '-' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Minus, L: $1, R: $3} + } +| BitExpr '+' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + $1, + $4, + ast.NewValueExpr($5), + }, + } + } +| BitExpr '-' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + $1, + $4, + ast.NewValueExpr($5), + }, + } + } +| BitExpr '*' BitExpr %prec '*' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mul, L: $1, R: $3} + } +| BitExpr '/' BitExpr %prec '/' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Div, L: $1, R: $3} + } +| BitExpr '%' BitExpr %prec '%' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr "DIV" BitExpr %prec div + { + $$ = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: $1, R: $3} + } +| BitExpr "MOD" BitExpr %prec mod + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr '^' BitExpr + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Xor, L: $1, R: $3} + } +| SimpleExpr + +SimpleIdent: + Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: model.NewCIStr($1), + }} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr($1), + Name: model.NewCIStr($3), + }} + } +| '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr($2), + Name: model.NewCIStr($4), + }} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: model.NewCIStr($1), + Table: model.NewCIStr($3), + Name: model.NewCIStr($5), + }} + } + +SimpleExpr: + SimpleIdent +| FunctionCallKeyword +| FunctionCallNonKeyword +| FunctionCallGeneric +| SimpleExpr "COLLATE" StringName %prec neg + { + // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. + $$ = $1 + } +| Literal +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } +| Variable +| SumExpr +| '!' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } +| '~' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: $2} + } +| '-' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: $2} + } +| '+' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: $2} + } +| SimpleExpr pipes SimpleExpr + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{$1, $3}} + } +| not2 SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } +| SubSelect +| '(' Expression ')' { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := $2 + expr.SetText(parser.src[startOffset:endOffset]) + $$ = &ast.ParenthesesExpr{Expr: expr} + } +| '(' ExpressionList ',' Expression ')' + { + values := append($2.([]ast.ExprNode), $4) + $$ = &ast.RowExpr{Values: values} + } +| "ROW" '(' ExpressionList ',' Expression ')' + { + values := append($3.([]ast.ExprNode), $5) + $$ = &ast.RowExpr{Values: values} + } +| "EXISTS" SubSelect + { + sq := $2.(*ast.SubqueryExpr) + sq.Exists = true + $$ = &ast.ExistsSubqueryExpr{Sel: sq} + } +| "BINARY" SimpleExpr %prec neg + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + x := types.NewFieldType(mysql.TypeString) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + $$ = &ast.FuncCastExpr{ + Expr: $2, + Tp: x, + FunctionType: ast.CastBinaryOperator, + } + } +| builtinCast '(' Expression "AS" CastType ')' + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastFunction, + } + } +| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" + { + x := &ast.CaseExpr{WhenClauses: $3.([]*ast.WhenClause)} + if $2 != nil { + x.Value = $2 + } + if $4 != nil { + x.ElseClause = $4.(ast.ExprNode) + } + $$ = x + } +| "CONVERT" '(' Expression ',' CastType ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastConvertFunction, + } + } +| "CONVERT" '(' Expression "USING" StringName ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr($5) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, charset1}, + } + } +| "DEFAULT" '(' SimpleIdent ')' + { + $$ = &ast.DefaultExpr{Name: $3.(*ast.ColumnNameExpr).Name} + } +| "VALUES" '(' SimpleIdent ')' %prec lowerThanInsertValues + { + $$ = &ast.ValuesExpr{Column: $3.(*ast.ColumnNameExpr)} + } +| SimpleIdent jss stringLit + { + expr := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + } +| SimpleIdent juss stringLit + { + expr := ast.NewValueExpr($3) + extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + +DistinctKwd: + "DISTINCT" +| "DISTINCTROW" + +DistinctOpt: + "ALL" + { + $$ = false + } +| DistinctKwd + { + $$ = true + } + +DefaultFalseDistinctOpt: + { + $$ = false + } +| DistinctOpt + +DefaultTrueDistinctOpt: + { + $$ = true + } +| DistinctOpt + +BuggyDefaultFalseDistinctOpt: + DefaultFalseDistinctOpt +| DistinctKwd "ALL" + { + $$ = true + } + + +FunctionNameConflict: + "ASCII" +| "CHARSET" +| "COALESCE" +| "COLLATION" +| "DATE" +| "DATABASE" +| "DAY" +| "HOUR" +| "IF" +| "INTERVAL" %prec lowerThanIntervalKeyword +| "FORMAT" +| "LEFT" +| "MICROSECOND" +| "MINUTE" +| "MONTH" +| builtinNow +| "QUARTER" +| "REPEAT" +| "REPLACE" +| "REVERSE" +| "RIGHT" +| "ROW_COUNT" +| "SECOND" +| "TIME" +| "TIMESTAMP" +| "TRUNCATE" +| "USER" +| "WEEK" +| "YEAR" + +OptionalBraces: + {} | '(' ')' {} + +FunctionNameOptionalBraces: + "CURRENT_USER" +| "CURRENT_DATE" +| "UTC_DATE" + +FunctionNameDatetimePrecision: + "CURRENT_TIME" +| "CURRENT_TIMESTAMP" +| "LOCALTIME" +| "LOCALTIMESTAMP" +| "UTC_TIME" +| "UTC_TIMESTAMP" + +FunctionCallKeyword: + FunctionNameConflict '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinUser '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameOptionalBraces OptionalBraces + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1)} + } +| builtinCurDate '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1)} + } +| FunctionNameDatetimePrecision FuncDatetimePrec + { + args := []ast.ExprNode{} + if $2 != nil { + args = append(args, $2.(ast.ExprNode)) + } + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: args} + } +| "CHAR" '(' ExpressionList ')' + { + nilVal := ast.NewValueExpr(nil) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } +| "CHAR" '(' ExpressionList "USING" StringName ')' + { + charset1 := ast.NewValueExpr($5) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } +| "DATE" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } +| "TIME" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } +| "TIMESTAMP" stringLit + { + expr := ast.NewValueExpr($2) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } +| "INSERT" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.InsertFunc), Args: $3.([]ast.ExprNode)} + } +| "MOD" '(' BitExpr ',' BitExpr ')' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $3, R: $5} + } +| "PASSWORD" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName:model.NewCIStr(ast.PasswordFunc), Args: $3.([]ast.ExprNode)} + } +| '{' ODBCDateTimeType stringLit '}' + { + // This is ODBC syntax for date and time literals. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + expr := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($2), Args: []ast.ExprNode{expr}} + } + +FunctionCallNonKeyword: + builtinCurTime '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinSysDate '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameDateArithMultiForms '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $5, + ast.NewValueExpr("DAY"), + }, + } + } +| FunctionNameDateArithMultiForms '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + ast.NewValueExpr($7), + }, + } + } +| FunctionNameDateArith '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + ast.NewValueExpr($7), + }, + } + } +| builtinExtract '(' TimeUnit "FROM" Expression ')' + { + timeUnit := ast.NewValueExpr($3) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{timeUnit, $5}, + } + } +| "GET_FORMAT" '(' GetFormatSelector ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ast.NewValueExpr($3), $5}, + } + } +| builtinPosition '(' BitExpr "IN" Expression ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: []ast.ExprNode{$3, $5}} + } +| builtinSubstring '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| builtinSubstring '(' Expression "FROM" Expression "FOR" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| "TIMESTAMPADD" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ast.NewValueExpr($3), $5, $7}, + } + } +| "TIMESTAMPDIFF" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{ast.NewValueExpr($3), $5, $7}, + } + } +| builtinTrim '(' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$3}, + } + } +| builtinTrim '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$5, $3}, + } + } +| builtinTrim '(' TrimDirection "FROM" Expression ')' + { + nilVal := ast.NewValueExpr(nil) + direction := ast.NewValueExpr(int($3.(ast.TrimDirectionType))) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$5, nilVal, direction}, + } + } +| builtinTrim '(' TrimDirection Expression "FROM" Expression ')' + { + direction := ast.NewValueExpr(int($3.(ast.TrimDirectionType))) + $$ = &ast.FuncCallExpr{ + FnName: model.NewCIStr($1), + Args: []ast.ExprNode{$6, $4, direction}, + } + } + +GetFormatSelector: + "DATE" + { + $$ = strings.ToUpper($1) + } +| "DATETIME" + { + $$ = strings.ToUpper($1) + } +| "TIME" + { + $$ = strings.ToUpper($1) + } +| "TIMESTAMP" + { + $$ = strings.ToUpper($1) + } + + +FunctionNameDateArith: + builtinDateAdd +| builtinDateSub + + +FunctionNameDateArithMultiForms: + builtinAddDate +| builtinSubDate + + +TrimDirection: + "BOTH" + { + $$ = ast.TrimBoth + } +| "LEADING" + { + $$ = ast.TrimLeading + } +| "TRAILING" + { + $$ = ast.TrimTrailing + } + +SumExpr: + "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinBitAnd '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinBitAnd '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinBitOr '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinBitOr '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinBitXor '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinBitXor '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinCount '(' DistinctKwd ExpressionList ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: $4.([]ast.ExprNode), Distinct: true} + } +| builtinCount '(' "ALL" Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } +| builtinCount '(' Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } +| builtinCount '(' '*' ')' + { + args := []ast.ExprNode{ast.NewValueExpr(1)} + $$ = &ast.AggregateFuncExpr{F: $1, Args: args} + } +| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' + { + args := $4.([]ast.ExprNode) + args = append(args, $6.(ast.ExprNode)) + $$ = &ast.AggregateFuncExpr{F: $1, Args: args, Distinct: $3.(bool)} + } +| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } +| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + +OptGConcatSeparator: + { + $$ = ast.NewValueExpr(",") + } +| "SEPARATOR" stringLit + { + $$ = ast.NewValueExpr($2) + } + + +FunctionCallGeneric: + identifier '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: model.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } + +FuncDatetimePrec: + { + $$ = nil + } +| '(' ')' + { + $$ = nil + } +| '(' intLit ')' + { + expr := ast.NewValueExpr($2) + $$ = expr + } + +TimeUnit: + "MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "SECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE" + { + $$ = strings.ToUpper($1) + } +| "HOUR" + { + $$ = strings.ToUpper($1) + } +| "DAY" + { + $$ = strings.ToUpper($1) + } +| "WEEK" + { + $$ = strings.ToUpper($1) + } +| "MONTH" + { + $$ = strings.ToUpper($1) + } +| "QUARTER" + { + $$ = strings.ToUpper($1) + } +| "YEAR" + { + $$ = strings.ToUpper($1) + } +| "SECOND_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE_SECOND" + { + $$ = strings.ToUpper($1) + } +| "HOUR_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "HOUR_SECOND" + { + $$ = strings.ToUpper($1) + } +| "HOUR_MINUTE" + { + $$ = strings.ToUpper($1) + } +| "DAY_MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "DAY_SECOND" + { + $$ = strings.ToUpper($1) + } +| "DAY_MINUTE" + { + $$ = strings.ToUpper($1) + } +| "DAY_HOUR" + { + $$ = strings.ToUpper($1) + } +| "YEAR_MONTH" + { + $$ = strings.ToUpper($1) + } + +TimestampUnit: + "MICROSECOND" + { + $$ = strings.ToUpper($1) + } +| "SECOND" + { + $$ = strings.ToUpper($1) + } +| "MINUTE" + { + $$ = strings.ToUpper($1) + } +| "HOUR" + { + $$ = strings.ToUpper($1) + } +| "DAY" + { + $$ = strings.ToUpper($1) + } +| "WEEK" + { + $$ = strings.ToUpper($1) + } +| "MONTH" + { + $$ = strings.ToUpper($1) + } +| "QUARTER" + { + $$ = strings.ToUpper($1) + } +| "YEAR" + { + $$ = strings.ToUpper($1) + } + +ExpressionOpt: + { + $$ = nil + } +| Expression + { + $$ = $1 + } + +WhenClauseList: + WhenClause + { + $$ = []*ast.WhenClause{$1.(*ast.WhenClause)} + } +| WhenClauseList WhenClause + { + $$ = append($1.([]*ast.WhenClause), $2.(*ast.WhenClause)) + } + +WhenClause: + "WHEN" Expression "THEN" Expression + { + $$ = &ast.WhenClause{ + Expr: $2, + Result: $4, + } + } + +ElseOpt: + /* empty */ + { + $$ = nil + } +| "ELSE" Expression + { + $$ = $2 + } + +CastType: + "BINARY" OptFieldLen + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = $2.(int) // TODO: Flen should be the flen of expression + if x.Flen != types.UnspecifiedLength { + x.Tp = mysql.TypeString + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "CHAR" OptFieldLen OptBinary + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = $2.(int) // TODO: Flen should be the flen of expression + x.Charset = $3.(*ast.OptBinary).Charset + if $3.(*ast.OptBinary).IsBinary{ + x.Flag |= mysql.BinaryFlag + } + if x.Charset == "" { + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + } + $$ = x + } +| "DATE" + { + x := types.NewFieldType(mysql.TypeDate) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "DATETIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "DECIMAL" FloatOpt + { + fopt := $2.(*ast.FloatOpt) + x := types.NewFieldType(mysql.TypeNewDecimal) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "TIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "SIGNED" OptInteger + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "UNSIGNED" OptInteger + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } +| "JSON" + { + x := types.NewFieldType(mysql.TypeJSON) + x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + $$ = x + } + +PriorityOpt: + { + $$ = mysql.NoPriority + } +| "LOW_PRIORITY" + { + $$ = mysql.LowPriority + } +| "HIGH_PRIORITY" + { + $$ = mysql.HighPriority + } +| "DELAYED" + { + $$ = mysql.DelayedPriority + } + +TableName: + Identifier + { + $$ = &ast.TableName{Name:model.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.TableName{Schema:model.NewCIStr($1), Name:model.NewCIStr($3)} + } + +TableNameList: + TableName + { + tbl := []*ast.TableName{$1.(*ast.TableName)} + $$ = tbl + } +| TableNameList ',' TableName + { + $$ = append($1.([]*ast.TableName), $3.(*ast.TableName)) + } + +QuickOptional: + %prec empty + { + $$ = false + } +| "QUICK" + { + $$ = true + } + +/***************************Prepared Statement Start****************************** + * See https://dev.mysql.com/doc/refman/5.7/en/prepare.html + * Example: + * PREPARE stmt_name FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * OR + * SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * PREPARE stmt_name FROM @s; + */ + +PreparedStmt: + "PREPARE" Identifier "FROM" PrepareSQL + { + var sqlText string + var sqlVar *ast.VariableExpr + switch $4.(type) { + case string: + sqlText = $4.(string) + case *ast.VariableExpr: + sqlVar = $4.(*ast.VariableExpr) + } + $$ = &ast.PrepareStmt{ + Name: $2, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + +PrepareSQL: + stringLit + { + $$ = $1 + } +| UserVariable + { + $$ = $1.(interface{}) + } + + +/* + * See https://dev.mysql.com/doc/refman/5.7/en/execute.html + * Example: + * EXECUTE stmt1 USING @a, @b; + * OR + * EXECUTE stmt1; + */ +ExecuteStmt: + "EXECUTE" Identifier + { + $$ = &ast.ExecuteStmt{Name: $2} + } +| "EXECUTE" Identifier "USING" UserVariableList + { + $$ = &ast.ExecuteStmt{ + Name: $2, + UsingVars: $4.([]ast.ExprNode), + } + } + +UserVariableList: + UserVariable + { + $$ = []ast.ExprNode{$1} + } +| UserVariableList ',' UserVariable + { + $$ = append($1.([]ast.ExprNode), $3) + } + +/* + * See https://dev.mysql.com/doc/refman/5.0/en/deallocate-prepare.html + */ + +DeallocateStmt: + DeallocateSym "PREPARE" Identifier + { + $$ = &ast.DeallocateStmt{Name: $3} + } + +DeallocateSym: +"DEALLOCATE" | "DROP" + +/****************************Prepared Statement End*******************************/ + + +RollbackStmt: + "ROLLBACK" + { + $$ = &ast.RollbackStmt{} + } + +SelectStmtBasic: + "SELECT" SelectStmtOpts SelectStmtFieldList + { + st := &ast.SelectStmt { + SelectStmtOpts: $2.(*ast.SelectStmtOpts), + Distinct: $2.(*ast.SelectStmtOpts).Distinct, + Fields: $3.(*ast.FieldList), + } + $$ = st + } + +SelectStmtFromDual: + SelectStmtBasic FromDual WhereClauseOptional OrderByOptional + { + st := $1.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-2].offset-1 + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if $3 != nil { + st.Where = $3.(ast.ExprNode) + } + + if $4 != nil { + st.OrderBy = $4.(*ast.OrderByClause) + } + } + + +SelectStmtFromTable: + SelectStmtBasic "FROM" + TableRefsClause WhereClauseOptional SelectStmtGroup HavingClause + { + st := $1.(*ast.SelectStmt) + st.From = $3.(*ast.TableRefsClause) + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-4]) + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if $4 != nil { + st.Where = $4.(ast.ExprNode) + } + if $5 != nil { + st.GroupBy = $5.(*ast.GroupByClause) + } + if $6 != nil { + st.Having = $6.(*ast.HavingClause) + } + $$ = st + } + +SelectStmt: + SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $4.(ast.SelectLockType) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + src := parser.src + var lastEnd int + if $2 != nil { + lastEnd = yyS[yypt-2].offset-1 + } else if $3 != nil { + lastEnd = yyS[yypt-1].offset-1 + } else if $4 != ast.SelectLockNone { + lastEnd = yyS[yypt].offset-1 + } else { + lastEnd = len(src) + if src[lastEnd-1] == ';' { + lastEnd-- + } + } + lastField.SetText(src[lastField.Offset:lastEnd]) + } + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + $$ = st + } +| SelectStmtFromDual SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $3.(ast.SelectLockType) + if $2 != nil { + st.Limit = $2.(*ast.Limit) + } + $$ = st + } +| SelectStmtFromTable OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $1.(*ast.SelectStmt) + st.LockTp = $4.(ast.SelectLockType) + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + $$ = st + } + +FromDual: + "FROM" "DUAL" + + +TableRefsClause: + TableRefs + { + $$ = &ast.TableRefsClause{TableRefs: $1.(*ast.Join)} + } + +TableRefs: + EscapedTableRef + { + if j, ok := $1.(*ast.Join); ok { + // if $1 is Join, use it directly + $$ = j + } else { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: nil} + } + } +| TableRefs ',' EscapedTableRef + { + /* from a, b is default cross join */ + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + +EscapedTableRef: + TableRef %prec lowerThanSetKeyword + { + $$ = $1 + } +| '{' Identifier TableRef '}' + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + $$ = $3 + } + +TableRef: + TableFactor + { + $$ = $1 + } +| JoinTable + { + $$ = $1 + } + +TableFactor: + TableName TableAsNameOpt IndexHintListOpt + { + tn := $1.(*ast.TableName) + tn.IndexHints = $3.([]*ast.IndexHint) + $$ = &ast.TableSource{Source: tn, AsName: $2.(model.CIStr)} + } +| '(' SelectStmt ')' TableAsName + { + st := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(st, endOffset) + $$ = &ast.TableSource{Source: $2.(*ast.SelectStmt), AsName: $4.(model.CIStr)} + } +| '(' UnionStmt ')' TableAsName + { + $$ = &ast.TableSource{Source: $2.(*ast.UnionStmt), AsName: $4.(model.CIStr)} + } +| '(' TableRefs ')' + { + $$ = $2 + } + +TableAsNameOpt: + { + $$ = model.CIStr{} + } +| TableAsName + { + $$ = $1 + } + +TableAsName: + Identifier + { + $$ = model.NewCIStr($1) + } +| "AS" Identifier + { + $$ = model.NewCIStr($2) + } + +IndexHintType: + "USE" KeyOrIndex + { + $$ = ast.HintUse + } +| "IGNORE" KeyOrIndex + { + $$ = ast.HintIgnore + } +| "FORCE" KeyOrIndex + { + $$ = ast.HintForce + } + +IndexHintScope: + { + $$ = ast.HintForScan + } +| "FOR" "JOIN" + { + $$ = ast.HintForJoin + } +| "FOR" "ORDER" "BY" + { + $$ = ast.HintForOrderBy + } +| "FOR" "GROUP" "BY" + { + $$ = ast.HintForGroupBy + } + + +IndexHint: + IndexHintType IndexHintScope '(' IndexNameList ')' + { + $$ = &ast.IndexHint{ + IndexNames: $4.([]model.CIStr), + HintType: $1.(ast.IndexHintType), + HintScope: $2.(ast.IndexHintScope), + } + } + +IndexNameList: + { + var nameList []model.CIStr + $$ = nameList + } +| Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| IndexNameList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + + +IndexHintList: + IndexHint + { + $$ = []*ast.IndexHint{$1.(*ast.IndexHint)} + } +| IndexHintList IndexHint + { + $$ = append($1.([]*ast.IndexHint), $2.(*ast.IndexHint)) + } + +IndexHintListOpt: + { + var hintList []*ast.IndexHint + $$ = hintList + } +| IndexHintList + { + $$ = $1 + } + +JoinTable: + /* Use %prec to evaluate production TableRef before cross join */ + TableRef CrossOpt TableRef %prec tableRefPriority + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } +| TableRef CrossOpt TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } +| TableRef CrossOpt TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: $6.([]*ast.ColumnName)} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $7} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), On: on} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), Using: $8.([]*ast.ColumnName)} + } +| TableRef "NATURAL" "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $4.(ast.ResultSetNode), NaturalJoin: true} + } +| TableRef "NATURAL" JoinType OuterOpt "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $6.(ast.ResultSetNode), Tp: $3.(ast.JoinType), NaturalJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true, On: on} + } + +JoinType: + "LEFT" + { + $$ = ast.LeftJoin + } +| "RIGHT" + { + $$ = ast.RightJoin + } + +OuterOpt: + {} +| "OUTER" + +CrossOpt: + "JOIN" +| "CROSS" "JOIN" +| "INNER" "JOIN" + + +LimitClause: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ValueExpr)} + } + +LimitOption: + LengthNum + { + $$ = ast.NewValueExpr($1) + } +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + +SelectStmtLimit: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ExprNode)} + } +| "LIMIT" LimitOption ',' LimitOption + { + $$ = &ast.Limit{Offset: $2.(ast.ExprNode), Count: $4.(ast.ExprNode)} + } +| "LIMIT" LimitOption "OFFSET" LimitOption + { + $$ = &ast.Limit{Offset: $4.(ast.ExprNode), Count: $2.(ast.ExprNode)} + } + + +SelectStmtOpts: + TableOptimizerHints DefaultFalseDistinctOpt PriorityOpt SelectStmtSQLCache SelectStmtCalcFoundRows SelectStmtStraightJoin + { + opt := &ast.SelectStmtOpts{} + if $1 != nil { + opt.TableHints = $1.([]*ast.TableOptimizerHint) + } + if $2 != nil { + opt.Distinct = $2.(bool) + } + if $3 != nil { + opt.Priority = $3.(mysql.PriorityEnum) + } + if $4 != nil { + opt.SQLCache = $4.(bool) + } + if $5 != nil { + opt.CalcFoundRows = $5.(bool) + } + if $6 != nil { + opt.StraightJoin = $6.(bool) + } + + $$ = opt + } + +TableOptimizerHints: + /* empty */ + { + $$ = nil + } +| hintBegin TableOptimizerHintList hintEnd + { + $$ = $2 + } + +HintTableList: + Identifier + { + $$ = []model.CIStr{model.NewCIStr($1)} + } +| HintTableList ',' Identifier + { + $$ = append($1.([]model.CIStr), model.NewCIStr($3)) + } + +TableOptimizerHintList: + TableOptimizerHintOpt + { + $$ = []*ast.TableOptimizerHint{$1.(*ast.TableOptimizerHint)} + } +| TableOptimizerHintList TableOptimizerHintOpt + { + $$ = append($1.([]*ast.TableOptimizerHint), $2.(*ast.TableOptimizerHint)) + } + +TableOptimizerHintOpt: + tidbSMJ '(' HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} + } +| tidbINLJ '(' HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} + } +| tidbHJ '(' HintTableList ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), Tables: $3.([]model.CIStr)} + } +| maxExecutionTime '(' NUM ')' + { + $$ = &ast.TableOptimizerHint{HintName: model.NewCIStr($1), MaxExecutionTime: getUint64FromNUM($3)} + } + +SelectStmtCalcFoundRows: + { + $$ = false + } +| "SQL_CALC_FOUND_ROWS" + { + $$ = true + } +SelectStmtSQLCache: + %prec empty + { + $$ = true + } +| "SQL_CACHE" + { + $$ = true + } +| "SQL_NO_CACHE" + { + $$ = false + } +SelectStmtStraightJoin: + %prec empty + { + $$ = false + } +| "STRAIGHT_JOIN" + { + $$ = true + } + +SelectStmtFieldList: + FieldList + { + $$ = &ast.FieldList{Fields: $1.([]*ast.SelectField)} + } + +SelectStmtGroup: + /* EMPTY */ + { + $$ = nil + } +| GroupByClause + +// See https://dev.mysql.com/doc/refman/5.7/en/subqueries.html +SubSelect: + '(' SelectStmt ')' + { + s := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(s, endOffset) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: s} + } +| '(' UnionStmt ')' + { + s := $2.(*ast.UnionStmt) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: s} + } + +// See https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html +SelectLockOpt: + /* empty */ + { + $$ = ast.SelectLockNone + } +| "FOR" "UPDATE" + { + $$ = ast.SelectLockForUpdate + } +| "LOCK" "IN" "SHARE" "MODE" + { + $$ = ast.SelectLockInShareMode + } + +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +UnionStmt: + UnionClauseList "UNION" UnionOpt SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt SelectStmtFromDual SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-4]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.Limit = $5.(*ast.Limit) + } else { + st.LockTp = $6.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt SelectStmtFromTable OrderByOptional + SelectStmtLimit SelectLockOpt + { + st := $4.(*ast.SelectStmt) + union := $1.(*ast.UnionStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $5 != nil { + union.OrderBy = $5.(*ast.OrderByClause) + } + if $6 != nil { + union.Limit = $6.(*ast.Limit) + } + if $5 == nil && $6 == nil { + st.LockTp = $7.(ast.SelectLockType) + } + $$ = union + } +| UnionClauseList "UNION" UnionOpt '(' SelectStmt ')' OrderByOptional SelectStmtLimit + { + union := $1.(*ast.UnionStmt) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-6]) + parser.setLastSelectFieldText(lastSelect, endOffset) + st := $5.(*ast.SelectStmt) + st.IsInBraces = true + st.IsAfterUnionDistinct = $3.(bool) + endOffset = parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(st, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if $7 != nil { + union.OrderBy = $7.(*ast.OrderByClause) + } + if $8 != nil { + union.Limit = $8.(*ast.Limit) + } + $$ = union + } + +UnionClauseList: + UnionSelect + { + selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{$1.(*ast.SelectStmt)}} + $$ = &ast.UnionStmt{ + SelectList: selectList, + } + } +| UnionClauseList "UNION" UnionOpt UnionSelect + { + union := $1.(*ast.UnionStmt) + st := $4.(*ast.SelectStmt) + st.IsAfterUnionDistinct = $3.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + $$ = union + } + +UnionSelect: + SelectStmt + { + $$ = $1.(interface{}) + } +| '(' SelectStmt ')' + { + st := $2.(*ast.SelectStmt) + st.IsInBraces = true + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(st, endOffset) + $$ = $2 + } + +UnionOpt: +DefaultTrueDistinctOpt + + +/********************Set Statement*******************************/ +SetStmt: + "SET" VariableAssignmentList + { + $$ = &ast.SetStmt{Variables: $2.([]*ast.VariableAssignment)} + } +| "SET" "PASSWORD" eq PasswordOpt + { + $$ = &ast.SetPwdStmt{Password: $4.(string)} + } +| "SET" "PASSWORD" "FOR" Username eq PasswordOpt + { + $$ = &ast.SetPwdStmt{User: $4.(*auth.UserIdentity), Password: $6.(string)} + } +| "SET" "GLOBAL" "TRANSACTION" TransactionChars + { + vars := $4.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + $$ = &ast.SetStmt{Variables: vars} + } +| "SET" "SESSION" "TRANSACTION" TransactionChars + { + $$ = &ast.SetStmt{Variables: $4.([]*ast.VariableAssignment)} + } +| "SET" "TRANSACTION" TransactionChars + { + assigns := $3.([]*ast.VariableAssignment) + for i:=0; i 24 { + x.Tp = mysql.TypeDouble + } + } + x.Decimal = fopt.Decimal + for _, o := range $3.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + $$ = x + } +| BitValueType OptFieldLen + { + x := types.NewFieldType($1.(byte)) + x.Flen = $2.(int) + if x.Flen == types.UnspecifiedLength || x.Flen == 0 { + x.Flen = 1 + } else if x.Flen > 64 { + yylex.Errorf("invalid field length %d for bit type, must in [1, 64]", x.Flen) + } + $$ = x + } + +IntegerType: + "TINYINT" + { + $$ = mysql.TypeTiny + } +| "SMALLINT" + { + $$ = mysql.TypeShort + } +| "MEDIUMINT" + { + $$ = mysql.TypeInt24 + } +| "INT" + { + $$ = mysql.TypeLong + } +| "INT1" + { + $$ = mysql.TypeTiny + } +| "INT2" + { + $$ = mysql.TypeShort + } +| "INT3" + { + $$ = mysql.TypeInt24 + } +| "INT4" + { + $$ = mysql.TypeLong + } +| "INT8" + { + $$ = mysql.TypeLonglong + } +| "INTEGER" + { + $$ = mysql.TypeLong + } +| "BIGINT" + { + $$ = mysql.TypeLonglong + } + + +BooleanType: + "BOOL" + { + $$ = mysql.TypeTiny + } +| "BOOLEAN" + { + $$ = mysql.TypeTiny + } + +OptInteger: + {} +| "INTEGER" +| "INT" + +FixedPointType: + "DECIMAL" + { + $$ = mysql.TypeNewDecimal + } +| "NUMERIC" + { + $$ = mysql.TypeNewDecimal + } + +FloatingPointType: + "FLOAT" + { + $$ = mysql.TypeFloat + } +| "REAL" + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + $$ = mysql.TypeFloat + } else { + $$ = mysql.TypeDouble + } + } +| "DOUBLE" + { + $$ = mysql.TypeDouble + } +| "DOUBLE" "PRECISION" + { + $$ = mysql.TypeDouble + } + +BitValueType: + "BIT" + { + $$ = mysql.TypeBit + } + +StringType: + NationalOpt "CHAR" FieldLen OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $3.(int) + x.Charset = $4.(*ast.OptBinary).Charset + x.Collate = $5.(string) + if $4.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| NationalOpt "CHAR" OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = $3.(*ast.OptBinary).Charset + x.Collate = $4.(string) + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "NATIONAL" "CHARACTER" FieldLen OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $3.(int) + x.Charset = $4.(*ast.OptBinary).Charset + x.Collate = $5.(string) + if $4.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| Varchar FieldLen OptBinary OptCollate + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = $3.(*ast.OptBinary).Charset + x.Collate = $4.(string) + if $3.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "BINARY" OptFieldLen + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = $2.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| "VARBINARY" FieldLen + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = $2.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = x + } +| BlobType + { + x := $1.(*types.FieldType) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + $$ = $1.(*types.FieldType) + } +| TextType OptBinary OptCollate + { + x := $1.(*types.FieldType) + x.Charset = $2.(*ast.OptBinary).Charset + x.Collate = $3.(string) + if $2.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + $$ = x + } +| "ENUM" '(' StringList ')' OptCharset OptCollate + { + x := types.NewFieldType(mysql.TypeEnum) + x.Elems = $3.([]string) + x.Charset = $5.(string) + x.Collate = $6.(string) + $$ = x + } +| "SET" '(' StringList ')' OptCharset OptCollate + { + x := types.NewFieldType(mysql.TypeSet) + x.Elems = $3.([]string) + x.Charset = $5.(string) + x.Collate = $6.(string) + $$ = x + } +| "JSON" + { + x := types.NewFieldType(mysql.TypeJSON) + x.Decimal = 0 + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + $$ = x + } + +NationalOpt: + {} +| "NATIONAL" + +Varchar: +"NATIONAL" "VARCHAR" +| "VARCHAR" +| "NVARCHAR" + + +BlobType: + "TINYBLOB" + { + x := types.NewFieldType(mysql.TypeTinyBlob) + $$ = x + } +| "BLOB" OptFieldLen + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = $2.(int) + $$ = x + } +| "MEDIUMBLOB" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } +| "LONGBLOB" + { + x := types.NewFieldType(mysql.TypeLongBlob) + $$ = x + } + +TextType: + "TINYTEXT" + { + x := types.NewFieldType(mysql.TypeTinyBlob) + $$ = x + + } +| "TEXT" OptFieldLen + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = $2.(int) + $$ = x + } +| "MEDIUMTEXT" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } +| "LONGTEXT" + { + x := types.NewFieldType(mysql.TypeLongBlob) + $$ = x + } +| "LONG" "VARCHAR" + { + x := types.NewFieldType(mysql.TypeMediumBlob) + $$ = x + } + + +DateAndTimeType: + "DATE" + { + x := types.NewFieldType(mysql.TypeDate) + $$ = x + } +| "DATETIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "TIMESTAMP" OptFieldLen + { + x := types.NewFieldType(mysql.TypeTimestamp) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "TIME" OptFieldLen + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen = mysql.MaxDurationWidthNoFsp + x.Decimal = $2.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + $$ = x + } +| "YEAR" OptFieldLen FieldOpts + { + x := types.NewFieldType(mysql.TypeYear) + x.Flen = $2.(int) + if x.Flen != types.UnspecifiedLength && x.Flen != 4 { + yylex.Errorf("Supports only YEAR or YEAR(4) column.") + return -1 + } + $$ = x + } + +FieldLen: + '(' LengthNum ')' + { + $$ = int($2.(uint64)) + } + +OptFieldLen: + { + $$ = types.UnspecifiedLength + } +| FieldLen + { + $$ = $1.(int) + } + +FieldOpt: + "UNSIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: true} + } +| "SIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: false} + } +| "ZEROFILL" + { + $$ = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + +FieldOpts: + { + $$ = []*ast.TypeOpt{} + } +| FieldOpts FieldOpt + { + $$ = append($1.([]*ast.TypeOpt), $2.(*ast.TypeOpt)) + } + +FloatOpt: + { + $$ = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } +| FieldLen + { + $$ = &ast.FloatOpt{Flen: $1.(int), Decimal: types.UnspecifiedLength} + } +| Precision + { + $$ = $1.(*ast.FloatOpt) + } + +Precision: + '(' LengthNum ',' LengthNum ')' + { + $$ = &ast.FloatOpt{Flen: int($2.(uint64)), Decimal: int($4.(uint64))} + } + +OptBinMod: + { + $$ = false + } +| "BINARY" + { + $$ = true + } + +OptBinary: + { + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } +| "BINARY" OptCharset + { + $$ = &ast.OptBinary{ + IsBinary: true, + Charset: $2.(string), + } + } +| CharsetKw CharsetName OptBinMod + { + $$ = &ast.OptBinary{ + IsBinary: $3.(bool), + Charset: $2.(string), + } + } + +OptCharset: + { + $$ = "" + } +| CharsetKw CharsetName + { + $$ = $2.(string) + } + +CharsetKw: + "CHARACTER" "SET" +| "CHARSET" + +OptCollate: + { + $$ = "" + } +| "COLLATE" StringName + { + $$ = $2.(string) + } + +StringList: + stringLit + { + $$ = []string{$1} + } +| StringList ',' stringLit + { + $$ = append($1.([]string), $3) + } + +StringName: + stringLit + { + $$ = $1 + } +| Identifier + { + $$ = $1 + } + +/*********************************************************************************** + * Update Statement + * See https://dev.mysql.com/doc/refman/5.7/en/update.html + ***********************************************************************************/ +UpdateStmt: + "UPDATE" TableOptimizerHints PriorityOpt IgnoreOptional TableRef "SET" AssignmentList WhereClauseOptional OrderByOptional LimitClause + { + var refs *ast.Join + if x, ok := $5.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: $5.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + if $9 != nil { + st.Order = $9.(*ast.OrderByClause) + } + if $10 != nil { + st.Limit = $10.(*ast.Limit) + } + $$ = st + } +| "UPDATE" TableOptimizerHints PriorityOpt IgnoreOptional TableRefs "SET" AssignmentList WhereClauseOptional + { + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: $5.(*ast.Join)}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + $$ = st + } + +UseStmt: + "USE" DBName + { + $$ = &ast.UseStmt{DBName: $2.(string)} + } + +WhereClause: + "WHERE" Expression + { + $$ = $2 + } + +WhereClauseOptional: + { + $$ = nil + } +| WhereClause + { + $$ = $1 + } + +CommaOpt: + {} +| ',' + {} + +/************************************************************************************ + * Account Management Statements + * https://dev.mysql.com/doc/refman/5.7/en/account-management-sql.html + ************************************************************************************/ +CreateUserStmt: + "CREATE" "USER" IfNotExists UserSpecList + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html + $$ = &ast.CreateUserStmt{ + IfNotExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + } + } + +/* See http://dev.mysql.com/doc/refman/5.7/en/alter-user.html */ +AlterUserStmt: + "ALTER" "USER" IfExists UserSpecList + { + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + } + } +| "ALTER" "USER" IfExists "USER" '(' ')' "IDENTIFIED" "BY" AuthString + { + auth := &ast.AuthOption { + AuthString: $9.(string), + ByAuthString: true, + } + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + CurrentAuth: auth, + } + } + +UserSpec: + Username AuthOption + { + userSpec := &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + } + if $2 != nil { + userSpec.AuthOpt = $2.(*ast.AuthOption) + } + $$ = userSpec + } + +UserSpecList: + UserSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| UserSpecList ',' UserSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +AuthOption: + { + $$ = nil + } +| "IDENTIFIED" "BY" AuthString + { + $$ = &ast.AuthOption { + AuthString: $3.(string), + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" StringName + { + $$ = nil + } +| "IDENTIFIED" "WITH" StringName "BY" AuthString + { + $$ = &ast.AuthOption { + AuthString: $5.(string), + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" StringName "AS" HashString + { + $$ = &ast.AuthOption{ + HashString: $5.(string), + } + } +| "IDENTIFIED" "BY" "PASSWORD" HashString + { + $$ = &ast.AuthOption{ + HashString: $4.(string), + } + } + +HashString: + stringLit + { + $$ = $1 + } + +/************************************************************************************* + * Grant statement + * See https://dev.mysql.com/doc/refman/5.7/en/grant.html + *************************************************************************************/ +GrantStmt: + "GRANT" PrivElemList "ON" ObjectType PrivLevel "TO" UserSpecList WithGrantOptionOpt + { + $$ = &ast.GrantStmt{ + Privs: $2.([]*ast.PrivElem), + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + WithGrant: $8.(bool), + } + } + +WithGrantOptionOpt: + { + $$ = false + } +| "WITH" "GRANT" "OPTION" + { + $$ = true + } +| "WITH" "MAX_QUERIES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_UPDATES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_CONNECTIONS_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_USER_CONNECTIONS" NUM + { + $$ = false + } + +PrivElem: + PrivType + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + } + } +| PrivType '(' ColumnNameList ')' + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + Cols: $3.([]*ast.ColumnName), + } + } + +PrivElemList: + PrivElem + { + $$ = []*ast.PrivElem{$1.(*ast.PrivElem)} + } +| PrivElemList ',' PrivElem + { + $$ = append($1.([]*ast.PrivElem), $3.(*ast.PrivElem)) + } + +PrivType: + "ALL" + { + $$ = mysql.AllPriv + } +| "ALL" "PRIVILEGES" + { + $$ = mysql.AllPriv + } +| "ALTER" + { + $$ = mysql.AlterPriv + } +| "CREATE" + { + $$ = mysql.CreatePriv + } +| "CREATE" "USER" + { + $$ = mysql.CreateUserPriv + } +| "TRIGGER" + { + $$ = mysql.TriggerPriv + } +| "DELETE" + { + $$ = mysql.DeletePriv + } +| "DROP" + { + $$ = mysql.DropPriv + } +| "PROCESS" + { + $$ = mysql.ProcessPriv + } +| "EXECUTE" + { + $$ = mysql.ExecutePriv + } +| "INDEX" + { + $$ = mysql.IndexPriv + } +| "INSERT" + { + $$ = mysql.InsertPriv + } +| "SELECT" + { + $$ = mysql.SelectPriv + } +| "SUPER" + { + $$ = mysql.SuperPriv + } +| "SHOW" "DATABASES" + { + $$ = mysql.ShowDBPriv + } +| "UPDATE" + { + $$ = mysql.UpdatePriv + } +| "GRANT" "OPTION" + { + $$ = mysql.GrantPriv + } +| "REFERENCES" + { + $$ = mysql.ReferencesPriv + } +| "REPLICATION" "SLAVE" + { + $$ = mysql.PrivilegeType(0) + } +| "REPLICATION" "CLIENT" + { + $$ = mysql.PrivilegeType(0) + } +| "USAGE" + { + $$ = mysql.PrivilegeType(0) + } +| "RELOAD" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "TEMPORARY" "TABLES" + { + $$ = mysql.PrivilegeType(0) + } +| "LOCK" "TABLES" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "VIEW" + { + $$ = mysql.PrivilegeType(0) + } +| "SHOW" "VIEW" + { + $$ = mysql.PrivilegeType(0) + } +| "CREATE" "ROUTINE" + { + $$ = mysql.PrivilegeType(0) + } +| "ALTER" "ROUTINE" + { + $$ = mysql.PrivilegeType(0) + } +| "EVENT" + { + $$ = mysql.PrivilegeType(0) + } + +ObjectType: + { + $$ = ast.ObjectTypeNone + } +| "TABLE" + { + $$ = ast.ObjectTypeTable + } + +PrivLevel: + '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelDB, + } + } +| '*' '.' '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelGlobal, + } + } +| Identifier '.' '*' + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelDB, + DBName: $1, + } + } +| Identifier '.' Identifier + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelTable, + DBName: $1, + TableName: $3, + } + } +| Identifier + { + $$ = &ast.GrantLevel { + Level: ast.GrantLevelTable, + TableName: $1, + } + } + +/**************************************RevokeStmt******************************************* + * See https://dev.mysql.com/doc/refman/5.7/en/revoke.html + *******************************************************************************************/ +RevokeStmt: + "REVOKE" PrivElemList "ON" ObjectType PrivLevel "FROM" UserSpecList + { + $$ = &ast.RevokeStmt{ + Privs: $2.([]*ast.PrivElem), + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + } + } + +/**************************************LoadDataStmt***************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/load-data.html + *******************************************************************************************/ +LoadDataStmt: + "LOAD" "DATA" LocalOpt "INFILE" stringLit "INTO" "TABLE" TableName CharsetOpt Fields Lines IgnoreLines ColumnNameListOptWithBrackets + { + x := &ast.LoadDataStmt{ + Path: $5, + Table: $8.(*ast.TableName), + Columns: $13.([]*ast.ColumnName), + IgnoreLines:$12.(uint64), + } + if $3 != nil { + x.IsLocal = true + } + if $10 != nil { + x.FieldsInfo = $10.(*ast.FieldsClause) + } + if $11 != nil { + x.LinesInfo = $11.(*ast.LinesClause) + } + $$ = x + } + +IgnoreLines: + { + $$ = uint64(0) + } +| "IGNORE" NUM "LINES" + { + $$ = getUint64FromNUM($2) + } + +CharsetOpt: + {} +| "CHARACTER" "SET" CharsetName + +LocalOpt: + { + $$ = nil + } +| "LOCAL" + { + $$ = $1 + } + +Fields: + { + escape := "\\" + $$ = &ast.FieldsClause{ + Terminated: "\t", + Escaped: escape[0], + } + } +| FieldsOrColumns FieldsTerminated Enclosed Escaped + { + escape := $4.(string) + if escape != "\\" && len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } + var enclosed byte + str := $3.(string) + if len(str) > 1 { + yylex.Errorf("Incorrect arguments %s to ENCLOSED", escape) + return 1 + }else if len(str) != 0 { + enclosed = str[0] + } + var escaped byte + if len(escape) > 0 { + escaped = escape[0] + } + $$ = &ast.FieldsClause{ + Terminated: $2.(string), + Enclosed: enclosed, + Escaped: escaped, + } + } + +FieldsOrColumns: +"FIELDS" | "COLUMNS" + +FieldsTerminated: + { + $$ = "\t" + } +| "TERMINATED" "BY" stringLit + { + $$ = $3 + } + +Enclosed: + { + $$ = "" + } +| "ENCLOSED" "BY" stringLit + { + $$ = $3 + } + +Escaped: + { + $$ = "\\" + } +| "ESCAPED" "BY" stringLit + { + $$ = $3 + } + +Lines: + { + $$ = &ast.LinesClause{Terminated: "\n"} + } +| "LINES" Starting LinesTerminated + { + $$ = &ast.LinesClause{Starting: $2.(string), Terminated: $3.(string)} + } + +Starting: + { + $$ = "" + } +| "STARTING" "BY" stringLit + { + $$ = $3 + } + +LinesTerminated: + { + $$ = "\n" + } +| "TERMINATED" "BY" stringLit + { + $$ = $3 + } + + +/********************************************************************* + * Lock/Unlock Tables + * See http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html + * All the statement leaves empty. This is used to prevent mysqldump error. + *********************************************************************/ + +UnlockTablesStmt: + "UNLOCK" TablesTerminalSym {} + +LockTablesStmt: + "LOCK" TablesTerminalSym TableLockList + {} + +TablesTerminalSym: + "TABLES" +| "TABLE" + +TableLock: + TableName LockType + +LockType: + "READ" +| "READ" "LOCAL" +| "WRITE" + +TableLockList: + TableLock +| TableLockList ',' TableLock + + +/******************************************************************** + * Kill Statement + * See https://dev.mysql.com/doc/refman/5.7/en/kill.html + *******************************************************************/ + +KillStmt: + KillOrKillTiDB NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($2), + TiDBExtension: $1.(bool), + } + } +| KillOrKillTiDB "CONNECTION" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + TiDBExtension: $1.(bool), + } + } +| KillOrKillTiDB "QUERY" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + Query: true, + TiDBExtension: $1.(bool), + } + } + +KillOrKillTiDB: + "KILL" + { + $$ = false + } +/* KILL TIDB is a special grammar extension in TiDB, it can be used only when + the client connect to TiDB directly, not proxied under LVS. */ +| "KILL" "TIDB" + { + $$ = true + } + +/*******************************************************************************************/ + +LoadStatsStmt: + "LOAD" "STATS" stringLit + { + $$ = &ast.LoadStatsStmt{ + Path: $3, + } + } + +%% diff --git a/parser_test.go b/parser_test.go new file mode 100644 index 000000000..86d94706b --- /dev/null +++ b/parser_test.go @@ -0,0 +1,2429 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "fmt" + "runtime" + "strings" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + _ "github.com/pingcap/tidb/types/parser_driver" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testParserSuite{}) + +type testParserSuite struct { +} + +func (s *testParserSuite) TestSimple(c *C) { + parser := New() + + reservedKws := []string{ + "add", "all", "alter", "analyze", "and", "as", "asc", "between", "bigint", + "binary", "blob", "both", "by", "cascade", "case", "change", "character", "check", "collate", + "column", "constraint", "convert", "create", "cross", "current_date", "current_time", + "current_timestamp", "current_user", "database", "databases", "day_hour", "day_microsecond", + "day_minute", "day_second", "decimal", "default", "delete", "desc", "describe", + "distinct", "distinctRow", "div", "double", "drop", "dual", "else", "enclosed", "escaped", + "exists", "explain", "false", "float", "for", "force", "foreign", "from", + "fulltext", "grant", "group", "having", "hour_microsecond", "hour_minute", + "hour_second", "if", "ignore", "in", "index", "infile", "inner", "insert", "int", "into", "integer", + "interval", "is", "join", "key", "keys", "kill", "leading", "left", "like", "limit", "lines", "load", + "localtime", "localtimestamp", "lock", "longblob", "longtext", "mediumblob", "maxvalue", "mediumint", "mediumtext", + "minute_microsecond", "minute_second", "mod", "not", "no_write_to_binlog", "null", "numeric", + "on", "option", "or", "order", "outer", "partition", "precision", "primary", "procedure", "range", "read", "real", + "references", "regexp", "rename", "repeat", "replace", "revoke", "restrict", "right", "rlike", + "schema", "schemas", "second_microsecond", "select", "set", "show", "smallint", + "starting", "table", "terminated", "then", "tinyblob", "tinyint", "tinytext", "to", + "trailing", "true", "union", "unique", "unlock", "unsigned", + "update", "use", "using", "utc_date", "values", "varbinary", "varchar", + "when", "where", "write", "xor", "year_month", "zerofill", + "generated", "virtual", "stored", "usage", + "delayed", "high_priority", "low_priority", + // TODO: support the following keywords + // "with", + } + for _, kw := range reservedKws { + src := fmt.Sprintf("SELECT * FROM db.%s;", kw) + _, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + + src = fmt.Sprintf("SELECT * FROM %s.desc", kw) + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + + src = fmt.Sprintf("SELECT t.%s FROM t", kw) + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + } + + // Testcase for unreserved keywords + unreservedKws := []string{ + "auto_increment", "after", "begin", "bit", "bool", "boolean", "charset", "columns", "commit", + "date", "datediff", "datetime", "deallocate", "do", "from_days", "end", "engine", "engines", "execute", "first", "full", + "local", "names", "offset", "password", "prepare", "quick", "rollback", "session", "signed", + "start", "global", "tables", "tablespace", "text", "time", "timestamp", "tidb", "transaction", "truncate", "unknown", + "value", "warnings", "year", "now", "substr", "subpartition", "subpartitions", "substring", "mode", "any", "some", "user", "identified", + "collation", "comment", "avg_row_length", "checksum", "compression", "connection", "key_block_size", + "max_rows", "min_rows", "national", "row", "quarter", "escape", "grants", "status", "fields", "triggers", + "delay_key_write", "isolation", "partitions", "repeatable", "committed", "uncommitted", "only", "serializable", "level", + "curtime", "variables", "dayname", "version", "btree", "hash", "row_format", "dynamic", "fixed", "compressed", + "compact", "redundant", "sql_no_cache sql_no_cache", "sql_cache sql_cache", "action", "round", + "enable", "disable", "reverse", "space", "privileges", "get_lock", "release_lock", "sleep", "no", "greatest", "least", + "binlog", "hex", "unhex", "function", "indexes", "from_unixtime", "processlist", "events", "less", "than", "timediff", + "ln", "log", "log2", "log10", "timestampdiff", "pi", "quote", "none", "super", "shared", "exclusive", + "always", "stats", "stats_meta", "stats_histogram", "stats_buckets", "stats_healthy", "tidb_version", "replication", "slave", "client", + "max_connections_per_hour", "max_queries_per_hour", "max_updates_per_hour", "max_user_connections", "event", "reload", "routine", "temporary", + } + for _, kw := range unreservedKws { + src := fmt.Sprintf("SELECT %s FROM tbl;", kw) + _, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil, Commentf("source %s", src)) + } + + // Testcase for prepared statement + src := "SELECT id+?, id+? from t;" + _, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // Testcase for -- Comment and unary -- operator + src = "CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED); -- foo\nSelect --1 from foo;" + stmts, err := parser.Parse(src, "", "") + c.Assert(err, IsNil) + c.Assert(stmts, HasLen, 2) + + // Testcase for /*! xx */ + // See http://dev.mysql.com/doc/refman/5.7/en/comments.html + // Fix: https://github.com/pingcap/tidb/issues/971 + src = "/*!40101 SET character_set_client = utf8 */;" + stmts, err = parser.Parse(src, "", "") + c.Assert(err, IsNil) + c.Assert(stmts, HasLen, 1) + stmt := stmts[0] + _, ok := stmt.(*ast.SetStmt) + c.Assert(ok, IsTrue) + + // for issue #2017 + src = "insert into blobtable (a) values ('/*! truncated */');" + stmt, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + is, ok := stmt.(*ast.InsertStmt) + c.Assert(ok, IsTrue) + c.Assert(is.Lists, HasLen, 1) + c.Assert(is.Lists[0], HasLen, 1) + c.Assert(is.Lists[0][0].(ast.ValueExpr).GetDatumString(), Equals, "/*! truncated */") + + // Testcase for CONVERT(expr,type) + src = "SELECT CONVERT('111', SIGNED);" + st, err := parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + ss, ok := st.(*ast.SelectStmt) + c.Assert(ok, IsTrue) + c.Assert(len(ss.Fields.Fields), Equals, 1) + cv, ok := ss.Fields.Fields[0].Expr.(*ast.FuncCastExpr) + c.Assert(ok, IsTrue) + c.Assert(cv.FunctionType, Equals, ast.CastConvertFunction) + + // for query start with comment + srcs := []string{ + "/* some comments */ SELECT CONVERT('111', SIGNED) ;", + "/* some comments */ /*comment*/ SELECT CONVERT('111', SIGNED) ;", + "SELECT /*comment*/ CONVERT('111', SIGNED) ;", + "SELECT CONVERT('111', /*comment*/ SIGNED) ;", + "SELECT CONVERT('111', SIGNED) /*comment*/;", + } + for _, src := range srcs { + st, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + ss, ok = st.(*ast.SelectStmt) + c.Assert(ok, IsTrue) + } + + // for issue #961 + src = "create table t (c int key);" + st, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + cs, ok := st.(*ast.CreateTableStmt) + c.Assert(ok, IsTrue) + c.Assert(cs.Cols, HasLen, 1) + c.Assert(cs.Cols[0].Options, HasLen, 1) + c.Assert(cs.Cols[0].Options[0].Tp, Equals, ast.ColumnOptionPrimaryKey) + + // for issue #4497 + src = "create table t1(a NVARCHAR(100));" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // for issue 2803 + src = "use quote;" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // issue #4354 + src = "select b'';" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + src = "select B'';" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // src = "select 0b'';" + // _, err = parser.ParseOneStmt(src, "", "") + // c.Assert(err, NotNil) + + // for #4909, support numericType `signed` filedOpt. + src = "CREATE TABLE t(_sms smallint signed, _smu smallint unsigned);" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + // for #7371, support NATIONAL CHARACTER + // reference link: https://dev.mysql.com/doc/refman/5.7/en/charset-national.html + src = "CREATE TABLE t(c1 NATIONAL CHARACTER(10));" + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + + src = `CREATE TABLE t(a tinyint signed, + b smallint signed, + c mediumint signed, + d int signed, + e int1 signed, + f int2 signed, + g int3 signed, + h int4 signed, + i int8 signed, + j integer signed, + k bigint signed, + l bool signed, + m boolean signed + );` + + st, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) + ct, ok := st.(*ast.CreateTableStmt) + c.Assert(ok, IsTrue) + for _, col := range ct.Cols { + c.Assert(col.Tp.Flag&mysql.UnsignedFlag, Equals, uint(0)) + } + + // for issue #4006 + src = `insert into tb(v) (select v from tb);` + _, err = parser.ParseOneStmt(src, "", "") + c.Assert(err, IsNil) +} + +type testCase struct { + src string + ok bool +} + +type testErrMsgCase struct { + src string + ok bool + err error +} + +func (s *testParserSuite) RunTest(c *C, table []testCase) { + parser := New() + for _, t := range table { + _, err := parser.Parse(t.src, "", "") + comment := Commentf("source %v", t.src) + if t.ok { + c.Assert(err, IsNil, comment) + } else { + c.Assert(err, NotNil, comment) + } + } +} + +func (s *testParserSuite) RunErrMsgTest(c *C, table []testErrMsgCase) { + parser := New() + for _, t := range table { + _, err := parser.Parse(t.src, "", "") + comment := Commentf("source %v", t.src) + if t.err != nil { + c.Assert(terror.ErrorEqual(err, t.err), IsTrue, comment) + } else { + c.Assert(err, IsNil, comment) + } + } +} + +func (s *testParserSuite) TestDMLStmt(c *C) { + table := []testCase{ + {"", true}, + {";", true}, + {"INSERT INTO foo VALUES (1234)", true}, + {"INSERT INTO foo VALUES (1234, 5678)", true}, + {"INSERT INTO t1 (SELECT * FROM t2)", true}, + // 15 + {"INSERT INTO foo VALUES (1 || 2)", true}, + {"INSERT INTO foo VALUES (1 | 2)", true}, + {"INSERT INTO foo VALUES (false || true)", true}, + {"INSERT INTO foo VALUES (bar(5678))", true}, + // 20 + {"INSERT INTO foo VALUES ()", true}, + {"SELECT * FROM t", true}, + {"SELECT * FROM t AS u", true}, + // 25 + {"SELECT * FROM t, v", true}, + {"SELECT * FROM t AS u, v", true}, + {"SELECT * FROM t, v AS w", true}, + {"SELECT * FROM t AS u, v AS w", true}, + {"SELECT * FROM foo, bar, foo", true}, + // 30 + {"SELECT DISTINCTS * FROM t", false}, + {"SELECT DISTINCT * FROM t", true}, + {"SELECT DISTINCTROW * FROM t", true}, + {"SELECT ALL * FROM t", true}, + {"SELECT DISTINCT ALL * FROM t", false}, + {"SELECT DISTINCTROW ALL * FROM t", false}, + {"INSERT INTO foo (a) VALUES (42)", true}, + {"INSERT INTO foo (a,) VALUES (42,)", false}, + // 35 + {"INSERT INTO foo (a,b) VALUES (42,314)", true}, + {"INSERT INTO foo (a,b,) VALUES (42,314)", false}, + {"INSERT INTO foo (a,b,) VALUES (42,314,)", false}, + {"INSERT INTO foo () VALUES ()", true}, + {"INSERT INTO foo VALUE ()", true}, + + // for issue 2402 + {"INSERT INTO tt VALUES (01000001783);", true}, + {"INSERT INTO tt VALUES (default);", true}, + + {"REPLACE INTO foo VALUES (1 || 2)", true}, + {"REPLACE INTO foo VALUES (1 | 2)", true}, + {"REPLACE INTO foo VALUES (false || true)", true}, + {"REPLACE INTO foo VALUES (bar(5678))", true}, + {"REPLACE INTO foo VALUES ()", true}, + {"REPLACE INTO foo (a,b) VALUES (42,314)", true}, + {"REPLACE INTO foo (a,b,) VALUES (42,314)", false}, + {"REPLACE INTO foo (a,b,) VALUES (42,314,)", false}, + {"REPLACE INTO foo () VALUES ()", true}, + {"REPLACE INTO foo VALUE ()", true}, + // 40 + {`SELECT stuff.id + FROM stuff + WHERE stuff.value >= ALL (SELECT stuff.value + FROM stuff)`, true}, + {"BEGIN", true}, + {"START TRANSACTION", true}, + // 45 + {"COMMIT", true}, + {"ROLLBACK", true}, + {`BEGIN; + INSERT INTO foo VALUES (42, 3.14); + INSERT INTO foo VALUES (-1, 2.78); + COMMIT;`, true}, + {`BEGIN; + INSERT INTO tmp SELECT * from bar; + SELECT * from tmp; + ROLLBACK;`, true}, + + // qualified select + {"SELECT a.b.c FROM t", true}, + {"SELECT a.b.*.c FROM t", false}, + {"SELECT a.b.* FROM t", true}, + {"SELECT a FROM t", true}, + {"SELECT a.b.c.d FROM t", false}, + + // do statement + {"DO 1", true}, + {"DO 1 from t", false}, + + // load data + {"load data infile '/tmp/t.csv' into table t", true}, + {"load data infile '/tmp/t.csv' into table t character set utf8", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab'", true}, + {"load data infile '/tmp/t.csv' into table t columns terminated by 'ab'", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*'", true}, + {"load data infile '/tmp/t.csv' into table t lines starting by 'ab'", true}, + {"load data infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy'", true}, + {"load data infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy'", true}, + {"load data infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab'", false}, + {"load data local infile '/tmp/t.csv' into table t", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab'", true}, + {"load data local infile '/tmp/t.csv' into table t columns terminated by 'ab'", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*'", true}, + {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*'", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab'", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy'", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy'", true}, + {"load data local infile '/tmp/t.csv' into table t terminated by 'xy' fields terminated by 'ab'", false}, + {"load data infile '/tmp/t.csv' into table t (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t columns terminated by 'ab' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' enclosed by 'b' escaped by '*' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t character set utf8 fields terminated by 'ab' lines terminated by 'xy' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' lines terminated by 'xy' (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t (a,b) fields terminated by 'ab'", false}, + {"load data local infile '/tmp/t.csv' into table t ignore 1 lines", true}, + {"load data local infile '/tmp/t.csv' into table t ignore -1 lines", false}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' (a,b) ignore 1 lines", false}, + {"load data local infile '/tmp/t.csv' into table t lines starting by 'ab' terminated by 'xy' ignore 1 lines", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by '*' ignore 1 lines (a,b)", true}, + {"load data local infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b' escaped by ''", true}, + + // select for update + {"SELECT * from t for update", true}, + {"SELECT * from t lock in share mode", true}, + + // from join + {"SELECT * from t1, t2, t3", true}, + {"select * from t1 join t2 left join t3 on t2.id = t3.id", true}, + {"select * from t1 right join t2 on t1.id = t2.id left join t3 on t3.id = t2.id", true}, + {"select * from t1 right join t2 on t1.id = t2.id left join t3", false}, + {"select * from t1 join t2 left join t3 using (id)", true}, + {"select * from t1 right join t2 using (id) left join t3 using (id)", true}, + {"select * from t1 right join t2 using (id) left join t3", false}, + {"select * from t1 natural join t2", true}, + {"select * from t1 natural right join t2", true}, + {"select * from t1 natural left outer join t2", true}, + {"select * from t1 natural inner join t2", false}, + {"select * from t1 natural cross join t2", false}, + + // for straight_join + {"select * from t1 straight_join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 left join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 right join t2 on t1.id = t2.id", true}, + {"select straight_join * from t1 straight_join t2 on t1.id = t2.id", true}, + + // for "USE INDEX" in delete statement + {"DELETE FROM t1 USE INDEX(idx_a) WHERE t1.id=1;", true}, + {"DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 WHERE t1.id=t2.id;", true}, + {"DELETE t1, t2 FROM t1 USE INDEX(idx_a) JOIN t2 USE INDEX(idx_a) WHERE t1.id=t2.id;", true}, + + // for admin + {"admin show ddl;", true}, + {"admin show ddl jobs;", true}, + {"admin show ddl jobs 20;", true}, + {"admin show ddl jobs -1;", false}, + {"admin show ddl job queries 1", true}, + {"admin show ddl job queries 1, 2, 3, 4", true}, + {"admin check table t1, t2;", true}, + {"admin check index tableName idxName;", true}, + {"admin check index tableName idxName (1, 2), (4, 5);", true}, + {"admin checksum table t1, t2;", true}, + {"admin cancel ddl jobs 1", true}, + {"admin cancel ddl jobs 1, 2", true}, + {"admin recover index t1 idx_a", true}, + {"admin cleanup index t1 idx_a", true}, + {"admin show slow top 3", true}, + {"admin show slow top internal 7", true}, + {"admin show slow top all 9", true}, + {"admin show slow recent 11", true}, + + // for on duplicate key update + {"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true}, + {"INSERT IGNORE INTO t (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);", true}, + + // for delete statement + {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;", true}, + {"DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;", true}, + {"DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id limit 10;", false}, + {"DELETE /*+ TiDB_INLJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id;", true}, + {"DELETE /*+ TiDB_HJ(t1, t2) */ t1, t2 from t1, t2 where t1.id=t2.id", true}, + + // for update statement + {"UPDATE t SET id = id + 1 ORDER BY id DESC;", true}, + {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id;", true}, + {"UPDATE items,month SET items.price=month.price WHERE items.id=month.id LIMIT 10;", false}, + {"UPDATE user T0 LEFT OUTER JOIN user_profile T1 ON T1.id = T0.profile_id SET T0.profile_id = 1 WHERE T0.profile_id IN (1);", true}, + {"UPDATE /*+ TiDB_INLJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true}, + {"UPDATE /*+ TiDB_SMJ(t1, t2) */ t1, t2 set t1.profile_id = 1, t2.profile_id = 1 where ta.a=t.ba", true}, + + // for select with where clause + {"SELECT * FROM t WHERE 1 = 1", true}, + + // for dual + {"select 1 from dual", true}, + {"select 1 from dual limit 1", true}, + {"select 1 where exists (select 2)", false}, + {"select 1 from dual where not exists (select 2)", true}, + {"select 1 as a from dual order by a", true}, + {"select 1 as a from dual where 1 < any (select 2) order by a", true}, + {"select 1 order by 1", true}, + + // for https://github.com/pingcap/tidb/issues/320 + {`(select 1);`, true}, + + // for https://github.com/pingcap/tidb/issues/1050 + {`SELECT /*!40001 SQL_NO_CACHE */ * FROM test WHERE 1 limit 0, 2000;`, true}, + + {`ANALYZE TABLE t`, true}, + + // for comments + {`/** 20180417 **/ show databases;`, true}, + {`/* 20180417 **/ show databases;`, true}, + {`/** 20180417 */ show databases;`, true}, + {`/** 20180417 ******/ show databases;`, true}, + + // for Binlog stmt + {`BINLOG ' +BxSFVw8JAAAA8QAAAPUAAAAAAAQANS41LjQ0LU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA5gm5Mg== +'/*!*/;`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestDBAStmt(c *C) { + table := []testCase{ + // for SHOW statement + {"SHOW VARIABLES LIKE 'character_set_results'", true}, + {"SHOW GLOBAL VARIABLES LIKE 'character_set_results'", true}, + {"SHOW SESSION VARIABLES LIKE 'character_set_results'", true}, + {"SHOW VARIABLES", true}, + {"SHOW GLOBAL VARIABLES", true}, + {"SHOW GLOBAL VARIABLES WHERE Variable_name = 'autocommit'", true}, + {"SHOW STATUS", true}, + {"SHOW GLOBAL STATUS", true}, + {"SHOW SESSION STATUS", true}, + {`SHOW STATUS LIKE 'Up%'`, true}, + {`SHOW STATUS WHERE Variable_name LIKE 'Up%'`, true}, + {`SHOW FULL TABLES FROM icar_qa LIKE play_evolutions`, true}, + {`SHOW FULL TABLES WHERE Table_Type != 'VIEW'`, true}, + {`SHOW GRANTS`, true}, + {`SHOW GRANTS FOR 'test'@'localhost'`, true}, + {`SHOW GRANTS FOR current_user()`, true}, + {`SHOW GRANTS FOR current_user`, true}, + {`SHOW COLUMNS FROM City;`, true}, + {`SHOW COLUMNS FROM tv189.1_t_1_x;`, true}, + {`SHOW FIELDS FROM City;`, true}, + {`SHOW TRIGGERS LIKE 't'`, true}, + {`SHOW DATABASES LIKE 'test2'`, true}, + {`SHOW PROCEDURE STATUS WHERE Db='test'`, true}, + {`SHOW FUNCTION STATUS WHERE Db='test'`, true}, + {`SHOW INDEX FROM t;`, true}, + {`SHOW KEYS FROM t;`, true}, + {`SHOW INDEX IN t;`, true}, + {`SHOW KEYS IN t;`, true}, + {`SHOW INDEXES IN t where true;`, true}, + {`SHOW KEYS FROM t FROM test where true;`, true}, + {`SHOW EVENTS FROM test_db WHERE definer = 'current_user'`, true}, + {`SHOW PLUGINS`, true}, + {`SHOW PROFILES`, true}, + {`SHOW MASTER STATUS`, true}, + {`SHOW PRIVILEGES`, true}, + // for show character set + {"show character set;", true}, + {"show charset", true}, + // for show collation + {"show collation", true}, + {`show collation like 'utf8%'`, true}, + {"show collation where Charset = 'utf8' and Collation = 'utf8_bin'", true}, + // for show full columns + {"show columns in t;", true}, + {"show full columns in t;", true}, + // for show create table + {"show create table test.t", true}, + {"show create table t", true}, + // for show stats_meta. + {"show stats_meta", true}, + {"show stats_meta where table_name = 't'", true}, + // for show stats_histograms + {"show stats_histograms", true}, + {"show stats_histograms where col_name = 'a'", true}, + // for show stats_buckets + {"show stats_buckets", true}, + {"show stats_buckets where col_name = 'a'", true}, + // for show stats_healthy. + {"show stats_healthy", true}, + {"show stats_healthy where table_name = 't'", true}, + + // for load stats + {"load stats '/tmp/stats.json'", true}, + // set + // user defined + {"SET @ = 1", true}, + {"SET @' ' = 1", true}, + {"SET @! = 1", false}, + {"SET @1 = 1", true}, + {"SET @a = 1", true}, + {"SET @b := 1", true}, + {"SET @.c = 1", true}, + {"SET @_d = 1", true}, + {"SET @_e._$. = 1", true}, + {"SET @~f = 1", false}, + {"SET @`g,` = 1", true}, + // session system variables + {"SET SESSION autocommit = 1", true}, + {"SET @@session.autocommit = 1", true}, + {"SET @@SESSION.autocommit = 1", true}, + {"SET @@GLOBAL.GTID_PURGED = '123'", true}, + {"SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN", true}, + {"SET LOCAL autocommit = 1", true}, + {"SET @@local.autocommit = 1", true}, + {"SET @@autocommit = 1", true}, + {"SET autocommit = 1", true}, + // global system variables + {"SET GLOBAL autocommit = 1", true}, + {"SET @@global.autocommit = 1", true}, + // set default value + {"SET @@global.autocommit = default", true}, + {"SET @@session.autocommit = default", true}, + // SET CHARACTER SET + {"SET CHARACTER SET utf8mb4;", true}, + {"SET CHARACTER SET 'utf8mb4';", true}, + // set password + {"SET PASSWORD = 'password';", true}, + {"SET PASSWORD FOR 'root'@'localhost' = 'password';", true}, + // SET TRANSACTION Syntax + {"SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ", true}, + {"SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ", true}, + {"SET SESSION TRANSACTION READ WRITE", true}, + {"SET SESSION TRANSACTION READ ONLY", true}, + {"SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", true}, + {"SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", true}, + {"SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE", true}, + {"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ", true}, + {"SET TRANSACTION READ WRITE", true}, + {"SET TRANSACTION READ ONLY", true}, + {"SET TRANSACTION ISOLATION LEVEL READ COMMITTED", true}, + {"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED", true}, + {"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE", true}, + // for set names + {"set names utf8", true}, + {"set names utf8 collate utf8_unicode_ci", true}, + {"set names binary", true}, + // for set names and set vars + {"set names utf8, @@session.sql_mode=1;", true}, + {"set @@session.sql_mode=1, names utf8, charset utf8;", true}, + + // for FLUSH statement + {"flush no_write_to_binlog tables tbl1 with read lock", true}, + {"flush table", true}, + {"flush tables", true}, + {"flush tables tbl1", true}, + {"flush no_write_to_binlog tables tbl1", true}, + {"flush local tables tbl1", true}, + {"flush table with read lock", true}, + {"flush tables tbl1, tbl2, tbl3", true}, + {"flush tables tbl1, tbl2, tbl3 with read lock", true}, + {"flush privileges", true}, + {"flush status", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestFlushTable(c *C) { + parser := New() + stmt, err := parser.Parse("flush local tables tbl1,tbl2 with read lock", "", "") + c.Assert(err, IsNil) + flushTable := stmt[0].(*ast.FlushStmt) + c.Assert(flushTable.Tp, Equals, ast.FlushTables) + c.Assert(flushTable.Tables[0].Name.L, Equals, "tbl1") + c.Assert(flushTable.Tables[1].Name.L, Equals, "tbl2") + c.Assert(flushTable.NoWriteToBinLog, IsTrue) + c.Assert(flushTable.ReadLock, IsTrue) +} + +func (s *testParserSuite) TestFlushPrivileges(c *C) { + parser := New() + stmt, err := parser.Parse("flush privileges", "", "") + c.Assert(err, IsNil) + flushPrivilege := stmt[0].(*ast.FlushStmt) + c.Assert(flushPrivilege.Tp, Equals, ast.FlushPrivileges) +} + +func (s *testParserSuite) TestExpression(c *C) { + table := []testCase{ + // sign expression + {"SELECT ++1", true}, + {"SELECT -*1", false}, + {"SELECT -+1", true}, + {"SELECT -1", true}, + {"SELECT --1", true}, + + // for string literal + {`select '''a''', """a"""`, true}, + {`select ''a''`, false}, + {`select ""a""`, false}, + {`select '''a''';`, true}, + {`select '\'a\'';`, true}, + {`select "\"a\"";`, true}, + {`select """a""";`, true}, + {`select _utf8"string";`, true}, + {`select _binary"string";`, true}, + {"select N'string'", true}, + {"select n'string'", true}, + // for comparison + {"select 1 <=> 0, 1 <=> null, 1 = null", true}, + // for date literal + {"select date'1989-09-10'", true}, + {"select date 19890910", false}, + // for time literal + {"select time '00:00:00.111'", true}, + {"select time 19890910", false}, + // for timestamp literal + {"select timestamp '1989-09-10 11:11:11'", true}, + {"select timestamp 19890910", false}, + + // The ODBC syntax for time/date/timestamp literal. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + {"select {ts '1989-09-10 11:11:11'}", true}, + {"select {d '1989-09-10'}", true}, + {"select {t '00:00:00.111'}", true}, + // If the identifier is not in (t, d, ts), we just ignore it and consider the following expression as the value. + // See: https://dev.mysql.com/doc/refman/5.7/en/expressions.html + {"select {ts123 '1989-09-10 11:11:11'}", true}, + {"select {ts123 123}", true}, + {"select {ts123 1 xor 1}", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestBuiltin(c *C) { + table := []testCase{ + // for builtin functions + {"SELECT POW(1, 2)", true}, + {"SELECT POW(1, 2, 1)", true}, // illegal number of arguments shall pass too + {"SELECT POW(1, 0.5)", true}, + {"SELECT POW(1, -1)", true}, + {"SELECT POW(-1, 1)", true}, + {"SELECT RAND();", true}, + {"SELECT RAND(1);", true}, + {"SELECT MOD(10, 2);", true}, + {"SELECT ROUND(-1.23);", true}, + {"SELECT ROUND(1.23, 1);", true}, + {"SELECT ROUND(1.23, 1, 1);", true}, + {"SELECT CEIL(-1.23);", true}, + {"SELECT CEILING(1.23);", true}, + {"SELECT FLOOR(-1.23);", true}, + {"SELECT LN(1);", true}, + {"SELECT LN(1, 2);", true}, + {"SELECT LOG(-2);", true}, + {"SELECT LOG(2, 65536);", true}, + {"SELECT LOG(2, 65536, 1);", true}, + {"SELECT LOG2(2);", true}, + {"SELECT LOG2(2, 2);", true}, + {"SELECT LOG10(10);", true}, + {"SELECT LOG10(10, 1);", true}, + {"SELECT ABS(10, 1);", true}, + {"SELECT ABS(10);", true}, + {"SELECT ABS();", true}, + {"SELECT CONV(10+'10'+'10'+X'0a',10,10);", true}, + {"SELECT CONV();", true}, + {"SELECT CRC32('MySQL');", true}, + {"SELECT CRC32();", true}, + {"SELECT SIGN();", true}, + {"SELECT SIGN(0);", true}, + {"SELECT SQRT(0);", true}, + {"SELECT SQRT();", true}, + {"SELECT ACOS();", true}, + {"SELECT ACOS(1);", true}, + {"SELECT ACOS(1, 2);", true}, + {"SELECT ASIN();", true}, + {"SELECT ASIN(1);", true}, + {"SELECT ASIN(1, 2);", true}, + {"SELECT ATAN(0), ATAN(1), ATAN(1, 2);", true}, + {"SELECT ATAN2(), ATAN2(1,2);", true}, + {"SELECT COS(0);", true}, + {"SELECT COS(1);", true}, + {"SELECT COS(1, 2);", true}, + {"SELECT COT();", true}, + {"SELECT COT(1);", true}, + {"SELECT COT(1, 2);", true}, + {"SELECT DEGREES();", true}, + {"SELECT DEGREES(0);", true}, + {"SELECT EXP();", true}, + {"SELECT EXP(1);", true}, + {"SELECT PI();", true}, + {"SELECT PI(1);", true}, + {"SELECT RADIANS();", true}, + {"SELECT RADIANS(1);", true}, + {"SELECT SIN();", true}, + {"SELECT SIN(1);", true}, + {"SELECT TAN(1);", true}, + {"SELECT TAN();", true}, + {"SELECT TRUNCATE(1.223,1);", true}, + {"SELECT TRUNCATE();", true}, + + {"SELECT SUBSTR('Quadratically',5);", true}, + {"SELECT SUBSTR('Quadratically',5, 3);", true}, + {"SELECT SUBSTR('Quadratically' FROM 5);", true}, + {"SELECT SUBSTR('Quadratically' FROM 5 FOR 3);", true}, + + {"SELECT SUBSTRING('Quadratically',5);", true}, + {"SELECT SUBSTRING('Quadratically',5, 3);", true}, + {"SELECT SUBSTRING('Quadratically' FROM 5);", true}, + {"SELECT SUBSTRING('Quadratically' FROM 5 FOR 3);", true}, + + {"SELECT CONVERT('111', SIGNED);", true}, + + {"SELECT LEAST(), LEAST(1, 2, 3);", true}, + + {"SELECT INTERVAL(1, 0, 1, 2)", true}, + {"SELECT DATE_ADD('2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY);", true}, + + // information functions + {"SELECT DATABASE();", true}, + {"SELECT SCHEMA();", true}, + {"SELECT USER();", true}, + {"SELECT USER(1);", true}, + {"SELECT CURRENT_USER();", true}, + {"SELECT CURRENT_USER;", true}, + {"SELECT CONNECTION_ID();", true}, + {"SELECT VERSION();", true}, + {"SELECT BENCHMARK(1000000, AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));", true}, + {"SELECT BENCHMARK(AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));", true}, + {"SELECT CHARSET('abc');", true}, + {"SELECT COERCIBILITY('abc');", true}, + {"SELECT COERCIBILITY('abc', 'a');", true}, + {"SELECT COLLATION('abc');", true}, + {"SELECT ROW_COUNT();", true}, + {"SELECT SESSION_USER();", true}, + {"SELECT SYSTEM_USER();", true}, + + {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);", true}, + {"SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);", true}, + + {`SELECT ASCII(), ASCII(""), ASCII("A"), ASCII(1);`, true}, + + {`SELECT LOWER("A"), UPPER("a")`, true}, + {`SELECT LCASE("A"), UCASE("a")`, true}, + + {`SELECT REPLACE('www.mysql.com', 'w', 'Ww')`, true}, + + {`SELECT LOCATE('bar', 'foobarbar');`, true}, + {`SELECT LOCATE('bar', 'foobarbar', 5);`, true}, + + {`SELECT tidb_version();`, true}, + {`SELECT tidb_is_ddl_owner();`, true}, + + // for time fsp + {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true}, + + // for row + {"select row(1)", false}, + {"select row(1, 1,)", false}, + {"select (1, 1,)", false}, + {"select row(1, 1) > row(1, 1), row(1, 1, 1) > row(1, 1, 1)", true}, + {"Select (1, 1) > (1, 1)", true}, + {"create table t (row int)", true}, + + // for cast with charset + {"SELECT *, CAST(data AS CHAR CHARACTER SET utf8) FROM t;", true}, + + // for cast as JSON + {"SELECT *, CAST(data AS JSON) FROM t;", true}, + + // for cast as signed int, fix issue #3691. + {"select cast(1 as signed int);", true}, + + // for last_insert_id + {"SELECT last_insert_id();", true}, + {"SELECT last_insert_id(1);", true}, + + // for binary operator + {"SELECT binary 'a';", true}, + + // for bit_count + {`SELECT BIT_COUNT(1);`, true}, + + // select time + {"select current_timestamp", true}, + {"select current_timestamp()", true}, + {"select current_timestamp(6)", true}, + {"select current_timestamp(null)", false}, + {"select current_timestamp(-1)", false}, + {"select current_timestamp(1.0)", false}, + {"select current_timestamp('2')", false}, + {"select now()", true}, + {"select now(6)", true}, + {"select sysdate(), sysdate(6)", true}, + {"SELECT time('01:02:03');", true}, + {"SELECT time('01:02:03.1')", true}, + {"SELECT time('20.1')", true}, + {"SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');", true}, + {"SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');", true}, + {"SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');", true}, + {"SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');", true}, + + // select current_time + {"select current_time", true}, + {"select current_time()", true}, + {"select current_time(6)", true}, + {"select current_time(-1)", false}, + {"select current_time(1.0)", false}, + {"select current_time('1')", false}, + {"select current_time(null)", false}, + {"select curtime()", true}, + {"select curtime(6)", true}, + {"select curtime(-1)", false}, + {"select curtime(1.0)", false}, + {"select curtime('1')", false}, + {"select curtime(null)", false}, + + // select utc_timestamp + {"select utc_timestamp", true}, + {"select utc_timestamp()", true}, + {"select utc_timestamp(6)", true}, + {"select utc_timestamp(-1)", false}, + {"select utc_timestamp(1.0)", false}, + {"select utc_timestamp('1')", false}, + {"select utc_timestamp(null)", false}, + + // select utc_time + {"select utc_time", true}, + {"select utc_time()", true}, + {"select utc_time(6)", true}, + {"select utc_time(-1)", false}, + {"select utc_time(1.0)", false}, + {"select utc_time('1')", false}, + {"select utc_time(null)", false}, + + // for microsecond, second, minute, hour + {"SELECT MICROSECOND('2009-12-31 23:59:59.000010');", true}, + {"SELECT SECOND('10:05:03');", true}, + {"SELECT MINUTE('2008-02-03 10:05:03');", true}, + {"SELECT HOUR(), HOUR('10:05:03');", true}, + + // for date, day, weekday + {"SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE()", true}, + {"SELECT CURRENT_DATE, CURRENT_DATE(), CURDATE(1)", false}, + {"SELECT DATEDIFF('2003-12-31', '2003-12-30');", true}, + {"SELECT DATE('2003-12-31 01:02:03');", true}, + {"SELECT DATE();", true}, + {"SELECT DATE('2003-12-31 01:02:03', '');", true}, + {`SELECT DATE_FORMAT('2003-12-31 01:02:03', '%W %M %Y');`, true}, + {"SELECT DAY('2007-02-03');", true}, + {"SELECT DAYOFMONTH('2007-02-03');", true}, + {"SELECT DAYOFWEEK('2007-02-03');", true}, + {"SELECT DAYOFYEAR('2007-02-03');", true}, + {"SELECT DAYNAME('2007-02-03');", true}, + {"SELECT FROM_DAYS(1423);", true}, + {"SELECT WEEKDAY('2007-02-03');", true}, + + // for utc_date + {"SELECT UTC_DATE, UTC_DATE();", true}, + {"SELECT UTC_DATE(), UTC_DATE()+0", true}, + + // for week, month, year + {"SELECT WEEK();", true}, + {"SELECT WEEK('2007-02-03');", true}, + {"SELECT WEEK('2007-02-03', 0);", true}, + {"SELECT WEEKOFYEAR('2007-02-03');", true}, + {"SELECT MONTH('2007-02-03');", true}, + {"SELECT MONTHNAME('2007-02-03');", true}, + {"SELECT YEAR('2007-02-03');", true}, + {"SELECT YEARWEEK('2007-02-03');", true}, + {"SELECT YEARWEEK('2007-02-03', 0);", true}, + + // for ADDTIME, SUBTIME + {"SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');", true}, + {"SELECT ADDTIME('02:00:00.999998');", true}, + {"SELECT ADDTIME();", true}, + {"SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');", true}, + + // for CONVERT_TZ + {"SELECT CONVERT_TZ();", true}, + {"SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');", true}, + {"SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00', '+10:00');", true}, + + // for GET_FORMAT + {"SELECT GET_FORMAT(DATE, 'USA');", true}, + {"SELECT GET_FORMAT(DATETIME, 'USA');", true}, + {"SELECT GET_FORMAT(TIME, 'USA');", true}, + {"SELECT GET_FORMAT(TIMESTAMP, 'USA');", true}, + + // for LOCALTIME, LOCALTIMESTAMP + {"SELECT LOCALTIME(), LOCALTIME(1)", true}, + {"SELECT LOCALTIMESTAMP(), LOCALTIMESTAMP(2)", true}, + + // for MAKEDATE, MAKETIME + {"SELECT MAKEDATE(2011,31);", true}, + {"SELECT MAKETIME(12,15,30);", true}, + {"SELECT MAKEDATE();", true}, + {"SELECT MAKETIME();", true}, + + // for PERIOD_ADD, PERIOD_DIFF + {"SELECT PERIOD_ADD(200801,2)", true}, + {"SELECT PERIOD_DIFF(200802,200703)", true}, + + // for QUARTER + {"SELECT QUARTER('2008-04-01');", true}, + + // for SEC_TO_TIME + {"SELECT SEC_TO_TIME(2378)", true}, + + // for TIME_FORMAT + {`SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l')`, true}, + + // for TIME_TO_SEC + {"SELECT TIME_TO_SEC('22:23:00')", true}, + + // for TIMESTAMPADD + {"SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');", true}, + + // for TO_DAYS, TO_SECONDS + {"SELECT TO_DAYS('2007-10-07')", true}, + {"SELECT TO_SECONDS('2009-11-29')", true}, + + // for LAST_DAY + {"SELECT LAST_DAY('2003-02-05');", true}, + + // for UTC_TIME + {"SELECT UTC_TIME(), UTC_TIME(1)", true}, + + // for time extract + {`select extract(microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(minute from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(week from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(month from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(quarter from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(year from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(second_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(minute_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(minute_second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour_second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(hour_minute from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_microsecond from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_second from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_minute from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(day_hour from "2011-11-11 10:10:10.123456")`, true}, + {`select extract(year_month from "2011-11-11 10:10:10.123456")`, true}, + + // for from_unixtime + {`select from_unixtime(1447430881)`, true}, + {`select from_unixtime(1447430881.123456)`, true}, + {`select from_unixtime(1447430881.1234567)`, true}, + {`select from_unixtime(1447430881.9999999)`, true}, + {`select from_unixtime(1447430881, "%Y %D %M %h:%i:%s %x")`, true}, + {`select from_unixtime(1447430881.123456, "%Y %D %M %h:%i:%s %x")`, true}, + {`select from_unixtime(1447430881.1234567, "%Y %D %M %h:%i:%s %x")`, true}, + + // for issue 224 + {`SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;`, true}, + + // for string functions + // trim + {`SELECT TRIM(' bar ');`, true}, + {`SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');`, true}, + {`SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');`, true}, + {`SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');`, true}, + {`SELECT LTRIM(' foo ');`, true}, + {`SELECT RTRIM(' bar ');`, true}, + + {`SELECT RPAD('hi', 6, 'c');`, true}, + {`SELECT BIT_LENGTH('hi');`, true}, + {`SELECT CHAR(65);`, true}, + {`SELECT CHAR_LENGTH('abc');`, true}, + {`SELECT CHARACTER_LENGTH('abc');`, true}, + {`SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');`, true}, + {`SELECT FIND_IN_SET('foo', 'foo,bar')`, true}, + {`SELECT FIND_IN_SET('foo')`, true}, // illegal number of argument still pass + {`SELECT MAKE_SET(1,'a'), MAKE_SET(1,'a','b','c')`, true}, + {`SELECT MID('Sakila', -5, 3)`, true}, + {`SELECT OCT(12)`, true}, + {`SELECT OCTET_LENGTH('text')`, true}, + {`SELECT ORD('2')`, true}, + {`SELECT POSITION('bar' IN 'foobarbar')`, true}, + {`SELECT QUOTE('Don\'t!')`, true}, + {`SELECT BIN(12)`, true}, + {`SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo')`, true}, + {`SELECT EXPORT_SET(5,'Y','N'), EXPORT_SET(5,'Y','N',','), EXPORT_SET(5,'Y','N',',',4)`, true}, + {`SELECT FORMAT(), FORMAT(12332.2,2,'de_DE'), FORMAT(12332.123456, 4)`, true}, + {`SELECT FROM_BASE64('abc')`, true}, + {`SELECT TO_BASE64('abc')`, true}, + {`SELECT INSERT(), INSERT('Quadratic', 3, 4, 'What'), INSTR('foobarbar', 'bar')`, true}, + {`SELECT LOAD_FILE('/tmp/picture')`, true}, + {`SELECT LPAD('hi',4,'??')`, true}, + {`SELECT LEFT("foobar", 3)`, true}, + {`SELECT RIGHT("foobar", 3)`, true}, + + // repeat + {`SELECT REPEAT("a", 10);`, true}, + + // for miscellaneous functions + {`SELECT SLEEP(10);`, true}, + {`SELECT ANY_VALUE(@arg);`, true}, + {`SELECT INET_ATON('10.0.5.9');`, true}, + {`SELECT INET_NTOA(167773449);`, true}, + {`SELECT INET6_ATON('fdfe::5a55:caff:fefa:9089');`, true}, + {`SELECT INET6_NTOA(INET_NTOA(167773449));`, true}, + {`SELECT IS_FREE_LOCK(@str);`, true}, + {`SELECT IS_IPV4('10.0.5.9');`, true}, + {`SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));`, true}, + {`SELECT IS_IPV4_MAPPED(INET6_ATON('::10.0.5.9'));`, true}, + {`SELECT IS_IPV6('10.0.5.9');`, true}, + {`SELECT IS_USED_LOCK(@str);`, true}, + {`SELECT MASTER_POS_WAIT(@log_name, @log_pos), MASTER_POS_WAIT(@log_name, @log_pos, @timeout), MASTER_POS_WAIT(@log_name, @log_pos, @timeout, @channel_name);`, true}, + {`SELECT NAME_CONST('myname', 14);`, true}, + {`SELECT RELEASE_ALL_LOCKS();`, true}, + {`SELECT UUID();`, true}, + {`SELECT UUID_SHORT()`, true}, + // test illegal arguments + {`SELECT SLEEP();`, true}, + {`SELECT ANY_VALUE();`, true}, + {`SELECT INET_ATON();`, true}, + {`SELECT INET_NTOA();`, true}, + {`SELECT INET6_ATON();`, true}, + {`SELECT INET6_NTOA(INET_NTOA());`, true}, + {`SELECT IS_FREE_LOCK();`, true}, + {`SELECT IS_IPV4();`, true}, + {`SELECT IS_IPV4_COMPAT(INET6_ATON());`, true}, + {`SELECT IS_IPV4_MAPPED(INET6_ATON());`, true}, + {`SELECT IS_IPV6()`, true}, + {`SELECT IS_USED_LOCK();`, true}, + {`SELECT MASTER_POS_WAIT();`, true}, + {`SELECT NAME_CONST();`, true}, + {`SELECT RELEASE_ALL_LOCKS(1);`, true}, + {`SELECT UUID(1);`, true}, + {`SELECT UUID_SHORT(1)`, true}, + // interval + {`select "2011-11-11 10:10:10.123456" + interval 10 second`, true}, + {`select "2011-11-11 10:10:10.123456" - interval 10 second`, true}, + // for date_add + {`select date_add("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select date_add("2011-11-11 10:10:10.123456", 10)`, false}, + {`select date_add("2011-11-11 10:10:10.123456", 0.10)`, false}, + {`select date_add("2011-11-11 10:10:10.123456", "11,11")`, false}, + + // for strcmp + {`select strcmp('abc', 'def')`, true}, + + // for adddate + {`select adddate("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", 10)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", 0.10)`, true}, + {`select adddate("2011-11-11 10:10:10.123456", "11,11")`, true}, + + // for date_sub + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select date_sub("2011-11-11 10:10:10.123456", 10)`, false}, + {`select date_sub("2011-11-11 10:10:10.123456", 0.10)`, false}, + {`select date_sub("2011-11-11 10:10:10.123456", "11,11")`, false}, + + // for subdate + {`select subdate("2011-11-11 10:10:10.123456", interval 10 microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 hour)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10 day)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 week)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 month)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 quarter)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 1 year)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10.10" second_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10.10" minute_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10" minute_second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10:10.10" hour_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10:10" hour_second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "10:10" hour_minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval 10.10 hour_minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10.10" day_microsecond)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10:10" day_second)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10:10" day_minute)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11 10" day_hour)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", interval "11-11" year_month)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", 10)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", 0.10)`, true}, + {`select subdate("2011-11-11 10:10:10.123456", "11,11")`, true}, + + // for unix_timestamp + {`select unix_timestamp()`, true}, + {`select unix_timestamp('2015-11-13 10:20:19.012')`, true}, + + // for misc functions + {`SELECT GET_LOCK('lock1',10);`, true}, + {`SELECT RELEASE_LOCK('lock1');`, true}, + + // for aggregate functions + {`select avg(), avg(c1,c2) from t;`, false}, + {`select avg(distinct c1) from t;`, true}, + {`select avg(distinctrow c1) from t;`, true}, + {`select avg(distinct all c1) from t;`, true}, + {`select avg(distinctrow all c1) from t;`, true}, + {`select avg(c2) from t;`, true}, + {`select bit_and(c1) from t;`, true}, + {`select bit_and(all c1) from t;`, true}, + {`select bit_and(distinct c1) from t;`, false}, + {`select bit_and(distinctrow c1) from t;`, false}, + {`select bit_and(distinctrow all c1) from t;`, false}, + {`select bit_and(distinct all c1) from t;`, false}, + {`select bit_and(), bit_and(distinct c1) from t;`, false}, + {`select bit_and(), bit_and(distinctrow c1) from t;`, false}, + {`select bit_and(), bit_and(all c1) from t;`, false}, + {`select bit_or(c1) from t;`, true}, + {`select bit_or(all c1) from t;`, true}, + {`select bit_or(distinct c1) from t;`, false}, + {`select bit_or(distinctrow c1) from t;`, false}, + {`select bit_or(distinctrow all c1) from t;`, false}, + {`select bit_or(distinct all c1) from t;`, false}, + {`select bit_or(), bit_or(distinct c1) from t;`, false}, + {`select bit_or(), bit_or(distinctrow c1) from t;`, false}, + {`select bit_or(), bit_or(all c1) from t;`, false}, + {`select bit_xor(c1) from t;`, true}, + {`select bit_xor(all c1) from t;`, true}, + {`select bit_xor(distinct c1) from t;`, false}, + {`select bit_xor(distinctrow c1) from t;`, false}, + {`select bit_xor(distinctrow all c1) from t;`, false}, + {`select bit_xor(), bit_xor(distinct c1) from t;`, false}, + {`select bit_xor(), bit_xor(distinctrow c1) from t;`, false}, + {`select bit_xor(), bit_xor(all c1) from t;`, false}, + {`select max(c1,c2) from t;`, false}, + {`select max(distinct c1) from t;`, true}, + {`select max(distinctrow c1) from t;`, true}, + {`select max(distinct all c1) from t;`, true}, + {`select max(distinctrow all c1) from t;`, true}, + {`select max(c2) from t;`, true}, + {`select min(c1,c2) from t;`, false}, + {`select min(distinct c1) from t;`, true}, + {`select min(distinctrow c1) from t;`, true}, + {`select min(distinct all c1) from t;`, true}, + {`select min(distinctrow all c1) from t;`, true}, + {`select min(c2) from t;`, true}, + {`select sum(c1,c2) from t;`, false}, + {`select sum(distinct c1) from t;`, true}, + {`select sum(distinctrow c1) from t;`, true}, + {`select sum(distinct all c1) from t;`, true}, + {`select sum(distinctrow all c1) from t;`, true}, + {`select sum(c2) from t;`, true}, + {`select count(c1) from t;`, true}, + {`select count(distinct *) from t;`, false}, + {`select count(distinctrow *) from t;`, false}, + {`select count(*) from t;`, true}, + {`select count(distinct c1, c2) from t;`, true}, + {`select count(distinctrow c1, c2) from t;`, true}, + {`select count(c1, c2) from t;`, false}, + {`select count(all c1) from t;`, true}, + {`select count(distinct all c1) from t;`, false}, + {`select count(distinctrow all c1) from t;`, false}, + {`select group_concat(c2,c1) from t group by c1;`, true}, + {`select group_concat(c2,c1 SEPARATOR ';') from t group by c1;`, true}, + {`select group_concat(distinct c2,c1) from t group by c1;`, true}, + {`select group_concat(distinctrow c2,c1) from t group by c1;`, true}, + {`SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;`, true}, + + // for encryption and compression functions + {`select AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3'))`, true}, + {`select AES_DECRYPT(@crypt_str,@key_str)`, true}, + {`select AES_DECRYPT(@crypt_str,@key_str,@init_vector);`, true}, + {`SELECT COMPRESS('');`, true}, + {`SELECT DECODE(@crypt_str, @pass_str);`, true}, + {`SELECT DES_DECRYPT(@crypt_str), DES_DECRYPT(@crypt_str, @key_str);`, true}, + {`SELECT DES_ENCRYPT(@str), DES_ENCRYPT(@key_num);`, true}, + {`SELECT ENCODE('cleartext', CONCAT('my_random_salt','my_secret_password'));`, true}, + {`SELECT ENCRYPT('hello'), ENCRYPT('hello', @salt);`, true}, + {`SELECT MD5('testing');`, true}, + {`SELECT OLD_PASSWORD(@str);`, true}, + {`SELECT PASSWORD(@str);`, true}, + {`SELECT RANDOM_BYTES(@len);`, true}, + {`SELECT SHA1('abc');`, true}, + {`SELECT SHA('abc');`, true}, + {`SELECT SHA2('abc', 224);`, true}, + {`SELECT UNCOMPRESS('any string');`, true}, + {`SELECT UNCOMPRESSED_LENGTH(@compressed_string);`, true}, + {`SELECT VALIDATE_PASSWORD_STRENGTH(@str);`, true}, + + // For JSON functions. + {`SELECT JSON_EXTRACT();`, true}, + {`SELECT JSON_UNQUOTE();`, true}, + {`SELECT JSON_TYPE('[123]');`, true}, + {`SELECT JSON_TYPE();`, true}, + + // For two json grammar sugar. + {`SELECT a->'$.a' FROM t`, true}, + {`SELECT a->>'$.a' FROM t`, true}, + {`SELECT '{}'->'$.a' FROM t`, false}, + {`SELECT '{}'->>'$.a' FROM t`, false}, + {`SELECT a->3 FROM t`, false}, + {`SELECT a->>3 FROM t`, false}, + + // Test that quoted identifier can be a function name. + {"SELECT `uuid`()", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestIdentifier(c *C) { + table := []testCase{ + // for quote identifier + {"select `a`, `a.b`, `a b` from t", true}, + // for unquoted identifier + {"create table MergeContextTest$Simple (value integer not null, primary key (value))", true}, + // for as + {"select 1 as a, 1 as `a`, 1 as \"a\", 1 as 'a'", true}, + {`select 1 as a, 1 as "a", 1 as 'a'`, true}, + {`select 1 a, 1 "a", 1 'a'`, true}, + {`select * from t as "a"`, false}, + {`select * from t a`, true}, + // reserved keyword can't be used as identifier directly, but A.B pattern is an exception + {`select COUNT from DESC`, false}, + {`select COUNT from SELECT.DESC`, true}, + {"use `select`", true}, + {"use select", false}, + {`select * from t as a`, true}, + {"select 1 full, 1 row, 1 abs", true}, + {"select * from t full, t1 row, t2 abs", true}, + // for issue 1878, identifiers may begin with digit. + {"create database 123test", true}, + {"create database 123", false}, + {"create database `123`", true}, + {"create table `123` (123a1 int)", true}, + {"create table 123 (123a1 int)", false}, + {fmt.Sprintf("select * from t%cble", 0), false}, + {"select 1 full, 1 row, 1 abs", true}, + {"select * from t full, t1 row, t2 abs", true}, + // for issue 3954, should NOT be recognized as identifiers. + {`select .78+123`, true}, + {`select .78+.21`, true}, + {`select .78-123`, true}, + {`select .78-.21`, true}, + {`select .78--123`, true}, + {`select .78*123`, true}, + {`select .78*.21`, true}, + {`select .78/123`, true}, + {`select .78/.21`, true}, + {`select .78,123`, true}, + {`select .78,.21`, true}, + {`select .78 , 123`, true}, + {`select .78.123`, false}, + {`select .78#123`, true}, // select .78 + {`insert float_test values(.67, 'string');`, true}, + {`select .78'123'`, true}, // select .78 as '123' + {"select .78`123`", true}, // select .78 as `123` + {`select .78"123"`, true}, // select .78 as "123" + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestDDL(c *C) { + table := []testCase{ + {"CREATE", false}, + {"CREATE TABLE", false}, + {"CREATE TABLE foo (", false}, + {"CREATE TABLE foo ()", false}, + {"CREATE TABLE foo ();", false}, + {"CREATE TABLE foo (a TINYINT UNSIGNED);", true}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED)", true}, + {"CREATE TABLE foo (a bigint unsigned, b bool);", true}, + {"CREATE TABLE foo (a TINYINT, b SMALLINT) CREATE TABLE bar (x INT, y int64)", false}, + {"CREATE TABLE foo (a int, b float); CREATE TABLE bar (x double, y float)", true}, + {"CREATE TABLE foo (a bytes)", false}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED)", true}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) -- foo", true}, + // {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) // foo", true}, + {"CREATE TABLE foo (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true}, + {"CREATE TABLE foo /* foo */ (a SMALLINT UNSIGNED, b INT UNSIGNED) /* foo */", true}, + {"CREATE TABLE foo (name CHAR(50) BINARY)", true}, + {"CREATE TABLE foo (name CHAR(50) COLLATE utf8_bin)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY)", true}, + {"CREATE TABLE foo (name CHAR(50) CHARACTER SET utf8 BINARY CHARACTER set utf8)", false}, + {"CREATE TABLE foo (name CHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin)", true}, + {"CREATE TABLE foo (a.b, b);", false}, + {"CREATE TABLE foo (a, b.c);", false}, + {"CREATE TABLE (name CHAR(50) BINARY)", false}, + // for table option + {"create table t (c int) avg_row_length = 3", true}, + {"create table t (c int) avg_row_length 3", true}, + {"create table t (c int) checksum = 0", true}, + {"create table t (c int) checksum 1", true}, + {"create table t (c int) compression = 'NONE'", true}, + {"create table t (c int) compression 'lz4'", true}, + {"create table t (c int) connection = 'abc'", true}, + {"create table t (c int) connection 'abc'", true}, + {"create table t (c int) key_block_size = 1024", true}, + {"create table t (c int) key_block_size 1024", true}, + {"create table t (c int) max_rows = 1000", true}, + {"create table t (c int) max_rows 1000", true}, + {"create table t (c int) min_rows = 1000", true}, + {"create table t (c int) min_rows 1000", true}, + {"create table t (c int) password = 'abc'", true}, + {"create table t (c int) password 'abc'", true}, + {"create table t (c int) DELAY_KEY_WRITE=1", true}, + {"create table t (c int) DELAY_KEY_WRITE 1", true}, + {"create table t (c int) ROW_FORMAT = default", true}, + {"create table t (c int) ROW_FORMAT default", true}, + {"create table t (c int) ROW_FORMAT = fixed", true}, + {"create table t (c int) ROW_FORMAT = compressed", true}, + {"create table t (c int) ROW_FORMAT = compact", true}, + {"create table t (c int) ROW_FORMAT = redundant", true}, + {"create table t (c int) ROW_FORMAT = dynamic", true}, + {"create table t (c int) STATS_PERSISTENT = default", true}, + {"create table t (c int) STATS_PERSISTENT = 0", true}, + {"create table t (c int) STATS_PERSISTENT = 1", true}, + {"create table t (c int) PACK_KEYS = 1", true}, + {"create table t (c int) PACK_KEYS = 0", true}, + {"create table t (c int) PACK_KEYS = DEFAULT", true}, + {`create table testTableCompression (c VARCHAR(15000)) compression="ZLIB";`, true}, + {`create table t1 (c1 int) compression="zlib";`, true}, + + // partition option + {"create table t (c int) PARTITION BY HASH (c) PARTITIONS 32;", true}, + {"create table t (c int) PARTITION BY RANGE (Year(VDate)) (PARTITION p1980 VALUES LESS THAN (1980) ENGINE = MyISAM, PARTITION p1990 VALUES LESS THAN (1990) ENGINE = MyISAM, PARTITION pothers VALUES LESS THAN MAXVALUE ENGINE = MyISAM)", true}, + {"create table t (c int, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '') PARTITION BY RANGE (UNIX_TIMESTAMP(create_time)) (PARTITION p201610 VALUES LESS THAN(1477929600), PARTITION p201611 VALUES LESS THAN(1480521600),PARTITION p201612 VALUES LESS THAN(1483200000),PARTITION p201701 VALUES LESS THAN(1485878400),PARTITION p201702 VALUES LESS THAN(1488297600),PARTITION p201703 VALUES LESS THAN(1490976000))", true}, + {"CREATE TABLE `md_product_shop` (`shopCode` varchar(4) DEFAULT NULL COMMENT '地点') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*!50100 PARTITION BY KEY (shopCode) PARTITIONS 19 */;", true}, + {"CREATE TABLE `payinfo1` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `oderTime` datetime NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=641533032 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 /*!50500 PARTITION BY RANGE COLUMNS(oderTime) (PARTITION P2011 VALUES LESS THAN ('2012-01-01 00:00:00') ENGINE = InnoDB, PARTITION P1201 VALUES LESS THAN ('2012-02-01 00:00:00') ENGINE = InnoDB, PARTITION PMAX VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB)*/;", true}, + {`CREATE TABLE app_channel_daily_report (id bigint(20) NOT NULL AUTO_INCREMENT, app_version varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'default', gmt_create datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=33703438 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci +/*!50100 PARTITION BY RANGE (month(gmt_create)-1) +(PARTITION part0 VALUES LESS THAN (1) COMMENT = '1月份' ENGINE = InnoDB, + PARTITION part1 VALUES LESS THAN (2) COMMENT = '2月份' ENGINE = InnoDB, + PARTITION part2 VALUES LESS THAN (3) COMMENT = '3月份' ENGINE = InnoDB, + PARTITION part3 VALUES LESS THAN (4) COMMENT = '4月份' ENGINE = InnoDB, + PARTITION part4 VALUES LESS THAN (5) COMMENT = '5月份' ENGINE = InnoDB, + PARTITION part5 VALUES LESS THAN (6) COMMENT = '6月份' ENGINE = InnoDB, + PARTITION part6 VALUES LESS THAN (7) COMMENT = '7月份' ENGINE = InnoDB, + PARTITION part7 VALUES LESS THAN (8) COMMENT = '8月份' ENGINE = InnoDB, + PARTITION part8 VALUES LESS THAN (9) COMMENT = '9月份' ENGINE = InnoDB, + PARTITION part9 VALUES LESS THAN (10) COMMENT = '10月份' ENGINE = InnoDB, + PARTITION part10 VALUES LESS THAN (11) COMMENT = '11月份' ENGINE = InnoDB, + PARTITION part11 VALUES LESS THAN (12) COMMENT = '12月份' ENGINE = InnoDB) */ ;`, true}, + + // for check clause + {"create table t (c1 bool, c2 bool, check (c1 in (0, 1)), check (c2 in (0, 1)))", true}, + {"CREATE TABLE Customer (SD integer CHECK (SD > 0), First_Name varchar(30));", true}, + + {"create database xxx", true}, + {"create database if exists xxx", false}, + {"create database if not exists xxx", true}, + {"create schema xxx", true}, + {"create schema if exists xxx", false}, + {"create schema if not exists xxx", true}, + // for drop database/schema/table/stats + {"drop database xxx", true}, + {"drop database if exists xxx", true}, + {"drop database if not exists xxx", false}, + {"drop schema xxx", true}, + {"drop schema if exists xxx", true}, + {"drop schema if not exists xxx", false}, + {"drop table", false}, + {"drop table xxx", true}, + {"drop table xxx, yyy", true}, + {"drop tables xxx", true}, + {"drop tables xxx, yyy", true}, + {"drop table if exists xxx", true}, + {"drop table if not exists xxx", false}, + {"drop table xxx restrict", true}, + {"drop table xxx, yyy cascade", true}, + {"drop table if exists xxx restrict", true}, + {"drop view if exists xxx", true}, + {"drop stats t", true}, + // for issue 974 + {`CREATE TABLE address ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(128) NOT NULL, + address_detail varchar(128) NOT NULL, + cellphone varchar(16) NOT NULL, + latitude double NOT NULL, + longitude double NOT NULL, + name varchar(16) NOT NULL, + sex tinyint(1) NOT NULL, + user_id bigint(20) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), + INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true}, + // for issue 975 + {`CREATE TABLE test_data ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(255) NOT NULL, + amount decimal(19,2) DEFAULT NULL, + charge_id varchar(32) DEFAULT NULL, + paid_amount decimal(19,2) DEFAULT NULL, + transaction_no varchar(64) DEFAULT NULL, + wx_mp_app_id varchar(32) DEFAULT NULL, + contacts varchar(50) DEFAULT NULL, + deliver_fee decimal(19,2) DEFAULT NULL, + deliver_info varchar(255) DEFAULT NULL, + deliver_time varchar(255) DEFAULT NULL, + description varchar(255) DEFAULT NULL, + invoice varchar(255) DEFAULT NULL, + order_from int(11) DEFAULT NULL, + order_state int(11) NOT NULL, + packing_fee decimal(19,2) DEFAULT NULL, + payment_time datetime DEFAULT NULL, + payment_type int(11) DEFAULT NULL, + phone varchar(50) NOT NULL, + store_employee_id bigint(20) DEFAULT NULL, + store_id bigint(20) NOT NULL, + user_id bigint(20) NOT NULL, + payment_mode int(11) NOT NULL, + current_latitude double NOT NULL, + current_longitude double NOT NULL, + address_latitude double NOT NULL, + address_longitude double NOT NULL, + PRIMARY KEY (id), + CONSTRAINT food_order_ibfk_1 FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id), + CONSTRAINT food_order_ibfk_2 FOREIGN KEY (store_id) REFERENCES waimaiqa.store (id), + CONSTRAINT food_order_ibfk_3 FOREIGN KEY (store_employee_id) REFERENCES waimaiqa.store_employee (id), + UNIQUE FK_UNIQUE_charge_id USING BTREE (charge_id) comment '', + INDEX FK_eqst2x1xisn3o0wbrlahnnqq8 USING BTREE (store_employee_id) comment '', + INDEX FK_8jcmec4kb03f4dod0uqwm54o9 USING BTREE (store_id) comment '', + INDEX FK_a3t0m9apja9jmrn60uab30pqd USING BTREE (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true}, + {`create table t (c int KEY);`, true}, + {`CREATE TABLE address ( + id bigint(20) NOT NULL AUTO_INCREMENT, + create_at datetime NOT NULL, + deleted tinyint(1) NOT NULL, + update_at datetime NOT NULL, + version bigint(20) DEFAULT NULL, + address varchar(128) NOT NULL, + address_detail varchar(128) NOT NULL, + cellphone varchar(16) NOT NULL, + latitude double NOT NULL, + longitude double NOT NULL, + name varchar(16) NOT NULL, + sex tinyint(1) NOT NULL, + user_id bigint(20) NOT NULL, + PRIMARY KEY (id), + CONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION, + INDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment '' + ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;`, true}, + {"CREATE TABLE address (\r\nid bigint(20) NOT NULL AUTO_INCREMENT,\r\ncreate_at datetime NOT NULL,\r\ndeleted tinyint(1) NOT NULL,\r\nupdate_at datetime NOT NULL,\r\nversion bigint(20) DEFAULT NULL,\r\naddress varchar(128) NOT NULL,\r\naddress_detail varchar(128) NOT NULL,\r\ncellphone varchar(16) NOT NULL,\r\nlatitude double NOT NULL,\r\nlongitude double NOT NULL,\r\nname varchar(16) NOT NULL,\r\nsex tinyint(1) NOT NULL,\r\nuser_id bigint(20) NOT NULL,\r\nPRIMARY KEY (id),\r\nCONSTRAINT FK_7rod8a71yep5vxasb0ms3osbg FOREIGN KEY (user_id) REFERENCES waimaiqa.user (id) ON DELETE CASCADE ON UPDATE NO ACTION,\r\nINDEX FK_7rod8a71yep5vxasb0ms3osbg (user_id) comment ''\r\n) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPACT COMMENT='' CHECKSUM=0 DELAY_KEY_WRITE=0;", true}, + // for issue 1802 + {`CREATE TABLE t1 ( + accout_id int(11) DEFAULT '0', + summoner_id int(11) DEFAULT '0', + union_name varbinary(52) NOT NULL, + union_id int(11) DEFAULT '0', + PRIMARY KEY (union_name)) ENGINE=MyISAM DEFAULT CHARSET=binary;`, true}, + // Create table with multiple index options. + {`create table t (c int, index ci (c) USING BTREE COMMENT "123");`, true}, + // for default value + {"CREATE TABLE sbtest (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, k integer UNSIGNED DEFAULT '0' NOT NULL, c char(120) DEFAULT '' NOT NULL, pad char(60) DEFAULT '' NOT NULL, PRIMARY KEY (id) )", true}, + {"create table test (create_date TIMESTAMP NOT NULL COMMENT '创建日期 create date' DEFAULT now());", true}, + {"create table ts (t int, v timestamp(3) default CURRENT_TIMESTAMP(3));", true}, + // Create table with primary key name. + {"create table if not exists `t` (`id` int not null auto_increment comment '消息ID', primary key `pk_id` (`id`) );", true}, + // Create table with like. + {"create table a like b", true}, + {"create table a (like b)", true}, + {"create table if not exists a like b", true}, + {"create table if not exists a (like b)", true}, + {"create table if not exists a like (b)", false}, + {"create table a (t int) like b", false}, + {"create table a (t int) like (b)", false}, + // Create table with select statement + {"create table a select * from b", true}, + {"create table a as select * from b", true}, + {"create table a (m int, n datetime) as select * from b", true}, + {"create table a (unique(n)) as select n from b", true}, + {"create table a ignore as select n from b", true}, + {"create table a replace as select n from b", true}, + {"create table a (m int) replace as (select n as m from b union select n+1 as m from c group by 1 limit 2)", true}, + + // Create table with no option is valid for parser + {"create table a", true}, + + {"create table t (a timestamp default now)", false}, + {"create table t (a timestamp default now())", true}, + {"create table t (a timestamp default now() on update now)", false}, + {"create table t (a timestamp default now() on update now())", true}, + {"CREATE TABLE t (c TEXT) default CHARACTER SET utf8, default COLLATE utf8_general_ci;", true}, + {"CREATE TABLE t (c TEXT) shard_row_id_bits = 1;", true}, + // Create table with ON UPDATE CURRENT_TIMESTAMP(6), specify fraction part. + {"CREATE TABLE IF NOT EXISTS `general_log` (`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),`user_host` mediumtext NOT NULL,`thread_id` bigint(20) unsigned NOT NULL,`server_id` int(10) unsigned NOT NULL,`command_type` varchar(64) NOT NULL,`argument` mediumblob NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'", true}, + // For reference_definition in column_definition. + {"CREATE TABLE followers ( f1 int NOT NULL REFERENCES user_profiles (uid) );", true}, + + // for alter table + {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED)", true}, + {"ALTER TABLE ADD COLUMN (a SMALLINT UNSIGNED)", false}, + {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED, b varchar(255))", true}, + {"ALTER TABLE t ADD COLUMN (a SMALLINT UNSIGNED FIRST)", false}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED FIRST", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED AFTER b", true}, + {"ALTER TABLE employees ADD PARTITION", true}, + {"ALTER TABLE employees ADD PARTITION ( PARTITION P1 VALUES LESS THAN (2010))", true}, + {"ALTER TABLE employees ADD PARTITION ( PARTITION P2 VALUES LESS THAN MAXVALUE)", true}, + {`ALTER TABLE employees ADD PARTITION ( + PARTITION P1 VALUES LESS THAN (2010), + PARTITION P2 VALUES LESS THAN (2015), + PARTITION P3 VALUES LESS THAN MAXVALUE)`, true}, + // For drop table partition statement. + {"alter table t drop partition p1;", true}, + {"alter table t drop partition p2;", true}, + {"ALTER TABLE t DISABLE KEYS", true}, + {"ALTER TABLE t ENABLE KEYS", true}, + {"ALTER TABLE t MODIFY COLUMN a varchar(255)", true}, + {"ALTER TABLE t CHANGE COLUMN a b varchar(255)", true}, + {"ALTER TABLE t CHANGE COLUMN a b varchar(255) CHARACTER SET utf8 BINARY", true}, + {"ALTER TABLE t CHANGE COLUMN a b varchar(255) FIRST", true}, + {"ALTER TABLE db.t RENAME to db1.t1", true}, + {"ALTER TABLE db.t RENAME db1.t1", true}, + {"ALTER TABLE t RENAME as t1", true}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT 1", true}, + {"ALTER TABLE t ALTER a SET DEFAULT 1", true}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT CURRENT_TIMESTAMP", false}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT NOW()", false}, + {"ALTER TABLE t ALTER COLUMN a SET DEFAULT 1+1", false}, + {"ALTER TABLE t ALTER COLUMN a DROP DEFAULT", true}, + {"ALTER TABLE t ALTER a DROP DEFAULT", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=none", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=default", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=shared", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, lock=exclusive", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=NONE", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=DEFAULT", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=SHARED", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, LOCK=EXCLUSIVE", true}, + {"ALTER TABLE t ADD FULLTEXT KEY `FullText` (`name` ASC)", true}, + {"ALTER TABLE t ADD FULLTEXT INDEX `FullText` (`name` ASC)", true}, + {"ALTER TABLE t ADD INDEX (a) USING BTREE COMMENT 'a'", true}, + {"ALTER TABLE t ADD KEY (a) USING HASH COMMENT 'a'", true}, + {"ALTER TABLE t ADD PRIMARY KEY (a) COMMENT 'a'", true}, + {"ALTER TABLE t ADD UNIQUE (a) COMMENT 'a'", true}, + {"ALTER TABLE t ADD UNIQUE KEY (a) COMMENT 'a'", true}, + {"ALTER TABLE t ADD UNIQUE INDEX (a) COMMENT 'a'", true}, + {"ALTER TABLE t ENGINE ''", true}, + {"ALTER TABLE t ENGINE = ''", true}, + {"ALTER TABLE t ENGINE = 'innodb'", true}, + {"ALTER TABLE t ENGINE = innodb", true}, + {"ALTER TABLE `db`.`t` ENGINE = ``", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT UNSIGNED, ADD COLUMN a SMALLINT", true}, + {"ALTER TABLE t ADD COLUMN a SMALLINT, ENGINE = '', default COLLATE = utf8_general_ci", true}, + {"ALTER TABLE t ENGINE = '', COMMENT='', default COLLATE = utf8_general_ci", true}, + {"ALTER TABLE t ENGINE = '', ADD COLUMN a SMALLINT", true}, + {"ALTER TABLE t default COLLATE = utf8_general_ci, ENGINE = '', ADD COLUMN a SMALLINT", true}, + {"ALTER TABLE t shard_row_id_bits = 1", true}, + {"ALTER TABLE t AUTO_INCREMENT 3", true}, + {"ALTER TABLE t AUTO_INCREMENT = 3", true}, + {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , ALGORITHM = DEFAULT;", true}, + {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , ALGORITHM = INPLACE;", true}, + {"ALTER TABLE `hello-world@dev`.`User` ADD COLUMN `name` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL , ALGORITHM = COPY;", true}, + {"ALTER TABLE t CONVERT TO CHARACTER SET utf8;", true}, + {"ALTER TABLE t CONVERT TO CHARSET utf8;", true}, + {"ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;", true}, + {"ALTER TABLE t CONVERT TO CHARSET utf8 COLLATE utf8_bin;", true}, + {"ALTER TABLE t FORCE", true}, + {"ALTER TABLE t DROP INDEX;", false}, + {"ALTER TABLE t DROP COLUMN a CASCADE", true}, + {`ALTER TABLE testTableCompression COMPRESSION="LZ4";`, true}, + {`ALTER TABLE t1 COMPRESSION="zlib";`, true}, + + // For #6405 + {"ALTER TABLE t RENAME KEY a TO b;", true}, + {"ALTER TABLE t RENAME INDEX a TO b;", true}, + + {"alter table t analyze partition a", true}, + {"alter table t analyze partition a with 4 buckets", true}, + {"alter table t analyze partition a index b", true}, + {"alter table t analyze partition a index b with 4 buckets", true}, + + // For create index statement + {"CREATE INDEX idx ON t (a)", true}, + {"CREATE INDEX idx ON t (a) USING HASH", true}, + {"CREATE INDEX idx ON t (a) COMMENT 'foo'", true}, + {"CREATE INDEX idx ON t (a) USING HASH COMMENT 'foo'", true}, + {"CREATE INDEX idx ON t (a) LOCK=NONE", true}, + {"CREATE INDEX idx USING BTREE ON t (a) USING HASH COMMENT 'foo'", true}, + {"CREATE INDEX idx USING BTREE ON t (a)", true}, + + // for rename table statement + {"RENAME TABLE t TO t1", true}, + {"RENAME TABLE t t1", false}, + {"RENAME TABLE d.t TO d1.t1", true}, + {"RENAME TABLE t1 TO t2, t3 TO t4", true}, + + // for truncate statement + {"TRUNCATE TABLE t1", true}, + {"TRUNCATE t1", true}, + + // for empty alert table index + {"ALTER TABLE t ADD INDEX () ", false}, + {"ALTER TABLE t ADD UNIQUE ()", false}, + {"ALTER TABLE t ADD UNIQUE INDEX ()", false}, + {"ALTER TABLE t ADD UNIQUE KEY ()", false}, + + // for issue 4538 + {"create table a (process double)", true}, + + // for issue 4740 + {"create table t (a int1, b int2, c int3, d int4, e int8)", true}, + + // for issue 5918 + {"create table t (lv long varchar null)", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestOptimizerHints(c *C) { + parser := New() + stmt, err := parser.Parse("select /*+ tidb_SMJ(T1,t2) tidb_smj(T3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt := stmt[0].(*ast.SelectStmt) + + hints := selectStmt.TableHints + c.Assert(len(hints), Equals, 2) + c.Assert(hints[0].HintName.L, Equals, "tidb_smj") + c.Assert(len(hints[0].Tables), Equals, 2) + c.Assert(hints[0].Tables[0].L, Equals, "t1") + c.Assert(hints[0].Tables[1].L, Equals, "t2") + + c.Assert(hints[1].HintName.L, Equals, "tidb_smj") + c.Assert(hints[1].Tables[0].L, Equals, "t3") + c.Assert(hints[1].Tables[1].L, Equals, "t4") + + c.Assert(len(selectStmt.TableHints), Equals, 2) + + stmt, err = parser.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_inlj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 2) + c.Assert(hints[0].HintName.L, Equals, "tidb_inlj") + c.Assert(len(hints[0].Tables), Equals, 2) + c.Assert(hints[0].Tables[0].L, Equals, "t1") + c.Assert(hints[0].Tables[1].L, Equals, "t2") + + c.Assert(hints[1].HintName.L, Equals, "tidb_inlj") + c.Assert(hints[1].Tables[0].L, Equals, "t3") + c.Assert(hints[1].Tables[1].L, Equals, "t4") + + stmt, err = parser.Parse("select /*+ TIDB_HJ(t1, T2) tidb_hj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 2) + c.Assert(hints[0].HintName.L, Equals, "tidb_hj") + c.Assert(len(hints[0].Tables), Equals, 2) + c.Assert(hints[0].Tables[0].L, Equals, "t1") + c.Assert(hints[0].Tables[1].L, Equals, "t2") + + c.Assert(hints[1].HintName.L, Equals, "tidb_hj") + c.Assert(hints[1].Tables[0].L, Equals, "t3") + c.Assert(hints[1].Tables[1].L, Equals, "t4") + + stmt, err = parser.Parse("SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.c1 = t2.c1", "", "") + c.Assert(err, IsNil) + selectStmt = stmt[0].(*ast.SelectStmt) + hints = selectStmt.TableHints + c.Assert(len(hints), Equals, 1) + c.Assert(hints[0].HintName.L, Equals, "max_execution_time") + c.Assert(hints[0].MaxExecutionTime, Equals, uint64(1000)) +} + +func (s *testParserSuite) TestType(c *C) { + table := []testCase{ + // for time fsp + {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true}, + + // for hexadecimal + {"select x'0a', X'11', 0x11", true}, + {"select x'13181C76734725455A'", true}, + {"select x'0xaa'", false}, + {"select 0X11", false}, + {"select 0x4920616D2061206C6F6E672068657820737472696E67", true}, + + // for bit + {"select 0b01, 0b0, b'11', B'11'", true}, + {"select 0B01", false}, + {"select 0b21", false}, + + // for enum and set type + {"create table t (c1 enum('a', 'b'), c2 set('a', 'b'))", true}, + {"create table t (c1 enum)", false}, + {"create table t (c1 set)", false}, + + // for blob and text field length + {"create table t (c1 blob(1024), c2 text(1024))", true}, + + // for year + {"create table t (y year(4), y1 year)", true}, + {"create table t (y year(4) unsigned zerofill zerofill, y1 year signed unsigned zerofill)", true}, + + // for national + {"create table t (c1 national char(2), c2 national varchar(2))", true}, + + // for json type + {`create table t (a JSON);`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestPrivilege(c *C) { + table := []testCase{ + // for create user + {`CREATE USER 'test'`, true}, + {`CREATE USER test`, true}, + {"CREATE USER `test`", true}, + {"CREATE USER test-user", false}, + {"CREATE USER test.user", false}, + {"CREATE USER 'test-user'", true}, + {"CREATE USER `test-user`", true}, + {"CREATE USER test.user", false}, + {"CREATE USER 'test.user'", true}, + {"CREATE USER `test.user`", true}, + {"CREATE USER uesr1@localhost", true}, + {"CREATE USER `uesr1`@localhost", true}, + {"CREATE USER uesr1@`localhost`", true}, + {"CREATE USER `uesr1`@`localhost`", true}, + {"CREATE USER 'uesr1'@localhost", true}, + {"CREATE USER uesr1@'localhost'", true}, + {"CREATE USER 'uesr1'@'localhost'", true}, + {"CREATE USER 'uesr1'@`localhost`", true}, + {"CREATE USER `uesr1`@'localhost'", true}, + {"create user 'bug19354014user'@'%' identified WITH mysql_native_password", true}, + {"create user 'bug19354014user'@'%' identified WITH mysql_native_password by 'new-password'", true}, + {"create user 'bug19354014user'@'%' identified WITH mysql_native_password as 'hashstring'", true}, + {`CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`CREATE USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`CREATE USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password'`, true}, + {`ALTER USER 'root'@'localhost' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-password', 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD 'hashstring'`, true}, + {`ALTER USER USER() IDENTIFIED BY 'new-password'`, true}, + {`ALTER USER IF EXISTS USER() IDENTIFIED BY 'new-password'`, true}, + {`DROP USER 'root'@'localhost', 'root1'@'localhost'`, true}, + {`DROP USER IF EXISTS 'root'@'localhost'`, true}, + + // for grant statement + {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost';", true}, + {"GRANT ALL ON db1.* TO 'jeffrey'@'localhost' WITH GRANT OPTION;", true}, + {"GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';", true}, + {"GRANT ALL ON *.* TO 'someuser'@'somehost';", true}, + {"GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';", true}, + {"GRANT ALL ON mydb.* TO 'someuser'@'somehost';", true}, + {"GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';", true}, + {"GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';", true}, + {"GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';", true}, + {"GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';", true}, + {"grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'password';", true}, + {"GRANT SELECT ON test.* to 'test'", true}, // For issue 2654. + {"grant PROCESS,usage, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'xxxxxxxxxx'@'%' identified by password 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'", true}, // For issue 4865 + {"/* rds internal mark */ GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, RELOAD, PROCESS, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER on *.* to 'root2'@'%' identified by password '*sdsadsdsadssadsadsadsadsada' with grant option", true}, + + // for revoke statement + {"REVOKE ALL ON db1.* FROM 'jeffrey'@'localhost';", true}, + {"REVOKE SELECT ON db2.invoice FROM 'jeffrey'@'localhost';", true}, + {"REVOKE ALL ON *.* FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT, INSERT ON *.* FROM 'someuser'@'somehost';", true}, + {"REVOKE ALL ON mydb.* FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT, INSERT ON mydb.* FROM 'someuser'@'somehost';", true}, + {"REVOKE ALL ON mydb.mytbl FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT, INSERT ON mydb.mytbl FROM 'someuser'@'somehost';", true}, + {"REVOKE SELECT (col1), INSERT (col1,col2) ON mydb.mytbl FROM 'someuser'@'somehost';", true}, + {"REVOKE all privileges on zabbix.* FROM 'zabbix'@'localhost' identified by 'password';", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestComment(c *C) { + table := []testCase{ + {"create table t (c int comment 'comment')", true}, + {"create table t (c int) comment = 'comment'", true}, + {"create table t (c int) comment 'comment'", true}, + {"create table t (c int) comment comment", false}, + {"create table t (comment text)", true}, + {"START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */", true}, + // for comment in query + {"/*comment*/ /*comment*/ select c /* this is a comment */ from t;", true}, + // for unclosed comment + {"delete from t where a = 7 or 1=1/*' and b = 'p'", false}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestCommentErrMsg(c *C) { + table := []testErrMsgCase{ + {"delete from t where a = 7 or 1=1/*' and b = 'p'", false, errors.New("[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' and b = 'p'' at line 1")}, + {"delete from t where a = 7 or\n 1=1/*' and b = 'p'", false, errors.New("[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' and b = 'p'' at line 2")}, + {"select 1/*", false, errors.New("[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' at line 1")}, + {"select 1/* comment */", false, nil}, + } + s.RunErrMsgTest(c, table) +} + +type subqueryChecker struct { + text string + c *C +} + +// Enter implements ast.Visitor interface. +func (sc *subqueryChecker) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { + if expr, ok := inNode.(*ast.SubqueryExpr); ok { + sc.c.Assert(expr.Query.Text(), Equals, sc.text) + return inNode, true + } + return inNode, false +} + +// Leave implements ast.Visitor interface. +func (sc *subqueryChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) { + return inNode, true +} + +func (s *testParserSuite) TestSubquery(c *C) { + table := []testCase{ + // for compare subquery + {"SELECT 1 > (select 1)", true}, + {"SELECT 1 > ANY (select 1)", true}, + {"SELECT 1 > ALL (select 1)", true}, + {"SELECT 1 > SOME (select 1)", true}, + + // for exists subquery + {"SELECT EXISTS select 1", false}, + {"SELECT EXISTS (select 1)", true}, + {"SELECT + EXISTS (select 1)", true}, + {"SELECT - EXISTS (select 1)", true}, + {"SELECT NOT EXISTS (select 1)", true}, + {"SELECT + NOT EXISTS (select 1)", false}, + {"SELECT - NOT EXISTS (select 1)", false}, + } + s.RunTest(c, table) + + tests := []struct { + input string + text string + }{ + {"SELECT 1 > (select 1)", "select 1"}, + {"SELECT 1 > (select 1 union select 2)", "select 1 union select 2"}, + } + parser := New() + for _, t := range tests { + stmt, err := parser.ParseOneStmt(t.input, "", "") + c.Assert(err, IsNil) + stmt.Accept(&subqueryChecker{ + text: t.text, + c: c, + }) + } +} +func (s *testParserSuite) TestUnion(c *C) { + table := []testCase{ + {"select c1 from t1 union select c2 from t2", true}, + {"select c1 from t1 union (select c2 from t2)", true}, + {"select c1 from t1 union (select c2 from t2) order by c1", true}, + {"select c1 from t1 union select c2 from t2 order by c2", true}, + {"select c1 from t1 union (select c2 from t2) limit 1", true}, + {"select c1 from t1 union (select c2 from t2) limit 1, 1", true}, + {"select c1 from t1 union (select c2 from t2) order by c1 limit 1", true}, + {"(select c1 from t1) union distinct select c2 from t2", true}, + {"(select c1 from t1) union distinctrow select c2 from t2", true}, + {"(select c1 from t1) union all select c2 from t2", true}, + {"(select c1 from t1) union distinct all select c2 from t2", false}, + {"(select c1 from t1) union distinctrow all select c2 from t2", false}, + {"(select c1 from t1) union (select c2 from t2) order by c1 union select c3 from t3", false}, + {"(select c1 from t1) union (select c2 from t2) limit 1 union select c3 from t3", false}, + {"(select c1 from t1) union select c2 from t2 union (select c3 from t3) order by c1 limit 1", true}, + {"select (select 1 union select 1) as a", true}, + {"select * from (select 1 union select 2) as a", true}, + {"insert into t select c1 from t1 union select c2 from t2", true}, + {"insert into t (c) select c1 from t1 union select c2 from t2", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestLikeEscape(c *C) { + table := []testCase{ + // for like escape + {`select "abc_" like "abc\\_" escape ''`, true}, + {`select "abc_" like "abc\\_" escape '\\'`, true}, + {`select "abc_" like "abc\\_" escape '||'`, false}, + {`select "abc" like "escape" escape '+'`, true}, + } + + s.RunTest(c, table) +} + +func (s *testParserSuite) TestMysqlDump(c *C) { + // Statements used by mysqldump. + table := []testCase{ + {`UNLOCK TABLES;`, true}, + {`LOCK TABLES t1 READ;`, true}, + {`show table status like 't'`, true}, + {`LOCK TABLES t2 WRITE`, true}, + + // for unlock table and lock table + {`UNLOCK TABLE;`, true}, + {`LOCK TABLE t1 READ;`, true}, + {`show table status like 't'`, true}, + {`LOCK TABLE t2 WRITE`, true}, + {`LOCK TABLE t1 WRITE, t3 READ`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestIndexHint(c *C) { + table := []testCase{ + {`select * from t use index ();`, true}, + {`select * from t use index (idx);`, true}, + {`select * from t use index (idx1, idx2);`, true}, + {`select * from t ignore key (idx1)`, true}, + {`select * from t force index for join (idx1)`, true}, + {`select * from t use index for order by (idx1)`, true}, + {`select * from t force index for group by (idx1)`, true}, + {`select * from t use index for group by (idx1) use index for order by (idx2), t2`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestPriority(c *C) { + table := []testCase{ + {`select high_priority * from t`, true}, + {`select low_priority * from t`, true}, + {`select delayed * from t`, true}, + {`insert high_priority into t values (1)`, true}, + {`insert LOW_PRIORITY into t values (1)`, true}, + {`insert delayed into t values (1)`, true}, + {`update low_priority t set a = 2`, true}, + {`update high_priority t set a = 2`, true}, + {`update delayed t set a = 2`, true}, + {`delete low_priority from t where a = 2`, true}, + {`delete high_priority from t where a = 2`, true}, + {`delete delayed from t where a = 2`, true}, + {`replace high_priority into t values (1)`, true}, + {`replace LOW_PRIORITY into t values (1)`, true}, + {`replace delayed into t values (1)`, true}, + } + s.RunTest(c, table) + + parser := New() + stmt, err := parser.Parse("select HIGH_PRIORITY * from t", "", "") + c.Assert(err, IsNil) + sel := stmt[0].(*ast.SelectStmt) + c.Assert(sel.SelectStmtOpts.Priority, Equals, mysql.HighPriority) +} + +func (s *testParserSuite) TestSQLNoCache(c *C) { + table := []testCase{ + {`select SQL_NO_CACHE * from t`, false}, + {`select SQL_CACHE * from t`, true}, + {`select * from t`, true}, + } + + parser := New() + for _, tt := range table { + stmt, err := parser.Parse(tt.src, "", "") + c.Assert(err, IsNil) + + sel := stmt[0].(*ast.SelectStmt) + c.Assert(sel.SelectStmtOpts.SQLCache, Equals, tt.ok) + } +} + +func (s *testParserSuite) TestEscape(c *C) { + table := []testCase{ + {`select """;`, false}, + {`select """";`, true}, + {`select "汉字";`, true}, + {`select 'abc"def';`, true}, + {`select 'a\r\n';`, true}, + {`select "\a\r\n"`, true}, + {`select "\xFF"`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestInsertStatementMemoryAllocation(c *C) { + sql := "insert t values (1)" + strings.Repeat(",(1)", 1000) + var oldStats, newStats runtime.MemStats + runtime.ReadMemStats(&oldStats) + _, err := New().ParseOneStmt(sql, "", "") + c.Assert(err, IsNil) + runtime.ReadMemStats(&newStats) + c.Assert(int(newStats.TotalAlloc-oldStats.TotalAlloc), Less, 1024*500) +} + +func (s *testParserSuite) TestExplain(c *C) { + table := []testCase{ + {"explain select c1 from t1", true}, + {"explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true}, + {"explain insert into t values (1), (2), (3)", true}, + {"explain replace into foo values (1 || 2)", true}, + {"explain update t set id = id + 1 order by id desc;", true}, + {"explain select c1 from t1 union (select c2 from t2) limit 1, 1", true}, + {`explain format = "row" select c1 from t1 union (select c2 from t2) limit 1, 1`, true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestTrace(c *C) { + table := []testCase{ + {"trace select c1 from t1", true}, + {"trace delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true}, + {"trace insert into t values (1), (2), (3)", true}, + {"trace replace into foo values (1 || 2)", true}, + {"trace update t set id = id + 1 order by id desc;", true}, + {"trace select c1 from t1 union (select c2 from t2) limit 1, 1", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestView(c *C) { + table := []testCase{ + {"create view v as select * from t", true}, + {"create or replace view v as select * from t", true}, + {"create or replace algorithm = undefined view v as select * from t", true}, + {"create or replace algorithm = merge view v as select * from t", true}, + {"create or replace algorithm = temptable view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security definer view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with local check option", true}, + {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as select * from t with cascaded check option", true}, + {"create or replace algorithm = merge definer = current_user view v as select * from t", true}, + } + s.RunTest(c, table) + + // Test case for the text of the select statement in create view statement. + p := New() + sms, err := p.Parse("create view v as select * from t", "", "") + c.Assert(err, IsNil) + v, ok := sms[0].(*ast.CreateViewStmt) + c.Assert(ok, IsTrue) + c.Assert(v.Select.Text(), Equals, "select * from t") +} + +func (s *testParserSuite) TestTimestampDiffUnit(c *C) { + // Test case for timestampdiff unit. + // TimeUnit should be unified to upper case. + parser := New() + stmt, err := parser.Parse("SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'), TIMESTAMPDIFF(month,'2003-02-01','2003-05-01');", "", "") + c.Assert(err, IsNil) + ss := stmt[0].(*ast.SelectStmt) + fields := ss.Fields.Fields + c.Assert(len(fields), Equals, 2) + expr := fields[0].Expr + f, ok := expr.(*ast.FuncCallExpr) + c.Assert(ok, IsTrue) + c.Assert(f.Args[0].(ast.ValueExpr).GetDatumString(), Equals, "MONTH") + + expr = fields[1].Expr + f, ok = expr.(*ast.FuncCallExpr) + c.Assert(ok, IsTrue) + c.Assert(f.Args[0].(ast.ValueExpr).GetDatumString(), Equals, "MONTH") + + // Test Illegal TimeUnit for TimestampDiff + table := []testCase{ + {"SELECT TIMESTAMPDIFF(SECOND_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(MINUTE_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(MINUTE_SECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(HOUR_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(HOUR_SECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(HOUR_MINUTE,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_MICROSECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_SECOND,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_MINUTE,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(DAY_HOUR,'2003-02-01','2003-05-01')", false}, + {"SELECT TIMESTAMPDIFF(YEAR_MONTH,'2003-02-01','2003-05-01')", false}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestSessionManage(c *C) { + table := []testCase{ + // Kill statement. + // See https://dev.mysql.com/doc/refman/5.7/en/kill.html + {"kill 23123", true}, + {"kill connection 23123", true}, + {"kill query 23123", true}, + {"kill tidb 23123", true}, + {"kill tidb connection 23123", true}, + {"kill tidb query 23123", true}, + {"show processlist", true}, + {"show full processlist", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestSQLModeANSIQuotes(c *C) { + parser := New() + parser.SetSQLMode(mysql.ModeANSIQuotes) + tests := []string{ + `CREATE TABLE "table" ("id" int)`, + `select * from t "tt"`, + } + for _, test := range tests { + _, err := parser.Parse(test, "", "") + c.Assert(err, IsNil) + } +} + +func (s *testParserSuite) TestDDLStatements(c *C) { + parser := New() + // Tests that whatever the charset it is define, we always assign utf8 charset and utf8_bin collate. + createTableStr := `CREATE TABLE t ( + a varchar(64) binary, + b char(10) charset utf8 collate utf8_general_ci, + c text charset latin1) ENGINE=innoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin` + stmts, err := parser.Parse(createTableStr, "", "") + c.Assert(err, IsNil) + stmt := stmts[0].(*ast.CreateTableStmt) + c.Assert(mysql.HasBinaryFlag(stmt.Cols[0].Tp.Flag), IsTrue) + for _, colDef := range stmt.Cols[1:] { + c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsFalse) + } + for _, tblOpt := range stmt.Options { + switch tblOpt.Tp { + case ast.TableOptionCharset: + c.Assert(tblOpt.StrValue, Equals, "utf8") + case ast.TableOptionCollate: + c.Assert(tblOpt.StrValue, Equals, "utf8_bin") + } + } + createTableStr = `CREATE TABLE t ( + a varbinary(64), + b binary(10), + c blob)` + stmts, err = parser.Parse(createTableStr, "", "") + c.Assert(err, IsNil) + stmt = stmts[0].(*ast.CreateTableStmt) + for _, colDef := range stmt.Cols { + c.Assert(colDef.Tp.Charset, Equals, charset.CharsetBin) + c.Assert(colDef.Tp.Collate, Equals, charset.CollationBin) + c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsTrue) + } +} + +func (s *testParserSuite) TestAnalyze(c *C) { + table := []testCase{ + {"analyze table t1", true}, + {"analyze table t,t1", true}, + {"analyze table t1 index", true}, + {"analyze table t1 index a", true}, + {"analyze table t1 index a,b", true}, + {"analyze table t with 4 buckets", true}, + {"analyze table t index a with 4 buckets", true}, + {"analyze table t partition a", true}, + {"analyze table t partition a with 4 buckets", true}, + {"analyze table t partition a index b", true}, + {"analyze table t partition a index b with 4 buckets", true}, + } + s.RunTest(c, table) +} + +func (s *testParserSuite) TestGeneratedColumn(c *C) { + tests := []struct { + input string + ok bool + expr string + }{ + {"create table t (c int, d int generated always as (c + 1) virtual)", true, "c + 1"}, + {"create table t (c int, d int as ( c + 1 ) virtual)", true, "c + 1"}, + {"create table t (c int, d int as (1 + 1) stored)", true, "1 + 1"}, + } + parser := New() + for _, tt := range tests { + stmtNodes, err := parser.Parse(tt.input, "", "") + if tt.ok { + c.Assert(err, IsNil) + stmtNode := stmtNodes[0] + for _, col := range stmtNode.(*ast.CreateTableStmt).Cols { + for _, opt := range col.Options { + if opt.Tp == ast.ColumnOptionGenerated { + c.Assert(opt.Expr.Text(), Equals, tt.expr) + } + } + } + } else { + c.Assert(err, NotNil) + } + } + +} + +func (s *testParserSuite) TestSetTransaction(c *C) { + // Set transaction is equivalent to setting the global or session value of tx_isolation. + // For example: + // SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED + // SET SESSION tx_isolation='READ-COMMITTED' + tests := []struct { + input string + isGlobal bool + value string + }{ + { + "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", + false, "READ-COMMITTED", + }, + { + "SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ", + true, "REPEATABLE-READ", + }, + } + parser := New() + for _, t := range tests { + stmt1, err := parser.ParseOneStmt(t.input, "", "") + c.Assert(err, IsNil) + setStmt := stmt1.(*ast.SetStmt) + vars := setStmt.Variables[0] + c.Assert(vars.Name, Equals, "tx_isolation") + c.Assert(vars.IsGlobal, Equals, t.isGlobal) + c.Assert(vars.IsSystem, Equals, true) + c.Assert(vars.Value.(ast.ValueExpr).GetValue(), Equals, t.value) + } +} + +func (s *testParserSuite) TestSideEffect(c *C) { + // This test cover a bug that parse an error SQL doesn't leave the parser in a + // clean state, cause the following SQL parse fail. + parser := New() + _, err := parser.ParseOneStmt("create table t /*!50100 'abc', 'abc' */;", "", "") + c.Assert(err, NotNil) + + _, err = parser.ParseOneStmt("show tables;", "", "") + c.Assert(err, IsNil) +} + +func (s *testParserSuite) TestTablePartition(c *C) { + table := []testCase{ + {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT 'APSTART \\' APEND')", true}, + {"ALTER TABLE t1 ADD PARTITION (PARTITION `p5` VALUES LESS THAN (2010) COMMENT = 'xxx')", true}, + {`CREATE TABLE t1 (a int not null,b int not null,c int not null,primary key(a,b)) + partition by range (a) + partitions 3 + (partition x1 values less than (5), + partition x2 values less than (10), + partition x3 values less than maxvalue);`, true}, + {"CREATE TABLE t1 (a int not null) partition by range (a) (partition x1 values less than (5) tablespace ts1)", true}, + {`create table t (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM, + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE MyISAM)`, true}, + {`create table t (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) ENGINE = MyISAM COMMENT 'xxx', + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM)`, true}, + {`create table t1 (a int) partition by range (a) + (PARTITION p0 VALUES LESS THAN (63340531200) COMMENT 'xxx' ENGINE = MyISAM , + PARTITION p1 VALUES LESS THAN (63342604800) ENGINE = MyISAM)`, true}, + {`create table t (id int) + partition by range (id) + subpartition by key (id) subpartitions 2 + (partition p0 values less than (42))`, true}, + {`create table t (id int) + partition by range (id) + subpartition by hash (id) + (partition p0 values less than (42))`, true}, + } + s.RunTest(c, table) + + // Check comment content. + parser := New() + stmt, err := parser.ParseOneStmt("create table t (id int) partition by range (id) (partition p0 values less than (10) comment 'check')", "", "") + c.Assert(err, IsNil) + createTable := stmt.(*ast.CreateTableStmt) + c.Assert(createTable.Partition.Definitions[0].Comment, Equals, "check") +} + +func (s *testParserSuite) TestNotExistsSubquery(c *C) { + table := []testCase{ + {`select * from t1 where not exists (select * from t2 where t1.a = t2.a)`, true}, + } + + parser := New() + for _, tt := range table { + stmt, err := parser.Parse(tt.src, "", "") + c.Assert(err, IsNil) + + sel := stmt[0].(*ast.SelectStmt) + exists, ok := sel.Where.(*ast.ExistsSubqueryExpr) + c.Assert(ok, IsTrue) + c.Assert(exists.Not, Equals, tt.ok) + } +} diff --git a/terror/terror.go b/terror/terror.go new file mode 100644 index 000000000..a5443653d --- /dev/null +++ b/terror/terror.go @@ -0,0 +1,344 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package terror + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + log "github.com/sirupsen/logrus" +) + +// Global error instances. +var ( + ErrCritical = ClassGlobal.New(CodeExecResultIsEmpty, "critical error %v") + ErrResultUndetermined = ClassGlobal.New(CodeResultUndetermined, "execution result undetermined") +) + +// ErrCode represents a specific error type in a error class. +// Same error code can be used in different error classes. +type ErrCode int + +const ( + // Executor error codes. + + // CodeUnknown is for errors of unknown reason. + CodeUnknown ErrCode = -1 + // CodeExecResultIsEmpty indicates execution result is empty. + CodeExecResultIsEmpty ErrCode = 3 + + // Expression error codes. + + // CodeMissConnectionID indicates connection id is missing. + CodeMissConnectionID ErrCode = 1 + + // Special error codes. + + // CodeResultUndetermined indicates the sql execution result is undetermined. + CodeResultUndetermined ErrCode = 2 +) + +// ErrClass represents a class of errors. +type ErrClass int + +// Error classes. +const ( + ClassAutoid ErrClass = iota + 1 + ClassDDL + ClassDomain + ClassEvaluator + ClassExecutor + ClassExpression + ClassAdmin + ClassKV + ClassMeta + ClassOptimizer + ClassParser + ClassPerfSchema + ClassPrivilege + ClassSchema + ClassServer + ClassStructure + ClassVariable + ClassXEval + ClassTable + ClassTypes + ClassGlobal + ClassMockTikv + ClassJSON + ClassTiKV + ClassSession + // Add more as needed. +) + +var errClz2Str = map[ErrClass]string{ + ClassAutoid: "autoid", + ClassDDL: "ddl", + ClassDomain: "domain", + ClassExecutor: "executor", + ClassExpression: "expression", + ClassAdmin: "admin", + ClassMeta: "meta", + ClassKV: "kv", + ClassOptimizer: "planner", + ClassParser: "parser", + ClassPerfSchema: "perfschema", + ClassPrivilege: "privilege", + ClassSchema: "schema", + ClassServer: "server", + ClassStructure: "structure", + ClassVariable: "variable", + ClassTable: "table", + ClassTypes: "types", + ClassGlobal: "global", + ClassMockTikv: "mocktikv", + ClassJSON: "json", + ClassTiKV: "tikv", + ClassSession: "session", +} + +// String implements fmt.Stringer interface. +func (ec ErrClass) String() string { + if s, exists := errClz2Str[ec]; exists { + return s + } + return strconv.Itoa(int(ec)) +} + +// EqualClass returns true if err is *Error with the same class. +func (ec ErrClass) EqualClass(err error) bool { + e := errors.Cause(err) + if e == nil { + return false + } + if te, ok := e.(*Error); ok { + return te.class == ec + } + return false +} + +// NotEqualClass returns true if err is not *Error with the same class. +func (ec ErrClass) NotEqualClass(err error) bool { + return !ec.EqualClass(err) +} + +// New creates an *Error with an error code and an error message. +// Usually used to create base *Error. +func (ec ErrClass) New(code ErrCode, message string) *Error { + return &Error{ + class: ec, + code: code, + message: message, + } +} + +// Error implements error interface and adds integer Class and Code, so +// errors with different message can be compared. +type Error struct { + class ErrClass + code ErrCode + message string + args []interface{} + file string + line int +} + +// Class returns ErrClass +func (e *Error) Class() ErrClass { + return e.class +} + +// Code returns ErrCode +func (e *Error) Code() ErrCode { + return e.code +} + +// MarshalJSON implements json.Marshaler interface. +func (e *Error) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + Class ErrClass `json:"class"` + Code ErrCode `json:"code"` + Msg string `json:"message"` + }{ + Class: e.class, + Code: e.code, + Msg: e.getMsg(), + }) +} + +// UnmarshalJSON implements json.Unmarshaler interface. +func (e *Error) UnmarshalJSON(data []byte) error { + err := &struct { + Class ErrClass `json:"class"` + Code ErrCode `json:"code"` + Msg string `json:"message"` + }{} + + if err := json.Unmarshal(data, &err); err != nil { + return errors.Trace(err) + } + + e.class = err.Class + e.code = err.Code + e.message = err.Msg + return nil +} + +// Location returns the location where the error is created, +// implements juju/errors locationer interface. +func (e *Error) Location() (file string, line int) { + return e.file, e.line +} + +// Error implements error interface. +func (e *Error) Error() string { + return fmt.Sprintf("[%s:%d]%s", e.class, e.code, e.getMsg()) +} + +func (e *Error) getMsg() string { + if len(e.args) > 0 { + return fmt.Sprintf(e.message, e.args...) + } + return e.message +} + +// GenWithStack generates a new *Error with the same class and code, and a new formatted message. +func (e *Error) GenWithStack(format string, args ...interface{}) error { + err := *e + err.message = format + err.args = args + return errors.AddStack(&err) +} + +// GenWithStackByArgs generates a new *Error with the same class and code, and new arguments. +func (e *Error) GenWithStackByArgs(args ...interface{}) error { + err := *e + err.args = args + return errors.AddStack(&err) +} + +// FastGen generates a new *Error with the same class and code, and a new formatted message. +// This will not call runtime.Caller to get file and line. +func (e *Error) FastGen(format string, args ...interface{}) error { + err := *e + err.message = format + err.args = args + return &err +} + +// Equal checks if err is equal to e. +func (e *Error) Equal(err error) bool { + originErr := errors.Cause(err) + if originErr == nil { + return false + } + + if error(e) == originErr { + return true + } + inErr, ok := originErr.(*Error) + return ok && e.class == inErr.class && e.code == inErr.code +} + +// NotEqual checks if err is not equal to e. +func (e *Error) NotEqual(err error) bool { + return !e.Equal(err) +} + +// ToSQLError convert Error to mysql.SQLError. +func (e *Error) ToSQLError() *mysql.SQLError { + code := e.getMySQLErrorCode() + return mysql.NewErrf(code, "%s", e.getMsg()) +} + +var defaultMySQLErrorCode uint16 + +func (e *Error) getMySQLErrorCode() uint16 { + codeMap, ok := ErrClassToMySQLCodes[e.class] + if !ok { + log.Warnf("Unknown error class: %v", e.class) + return defaultMySQLErrorCode + } + code, ok := codeMap[e.code] + if !ok { + log.Debugf("Unknown error class: %v code: %v", e.class, e.code) + return defaultMySQLErrorCode + } + return code +} + +var ( + // ErrClassToMySQLCodes is the map of ErrClass to code-map. + ErrClassToMySQLCodes map[ErrClass]map[ErrCode]uint16 +) + +func init() { + ErrClassToMySQLCodes = make(map[ErrClass]map[ErrCode]uint16) + defaultMySQLErrorCode = mysql.ErrUnknown +} + +// ErrorEqual returns a boolean indicating whether err1 is equal to err2. +func ErrorEqual(err1, err2 error) bool { + e1 := errors.Cause(err1) + e2 := errors.Cause(err2) + + if e1 == e2 { + return true + } + + if e1 == nil || e2 == nil { + return e1 == e2 + } + + te1, ok1 := e1.(*Error) + te2, ok2 := e2.(*Error) + if ok1 && ok2 { + return te1.class == te2.class && te1.code == te2.code + } + + return e1.Error() == e2.Error() +} + +// ErrorNotEqual returns a boolean indicating whether err1 isn't equal to err2. +func ErrorNotEqual(err1, err2 error) bool { + return !ErrorEqual(err1, err2) +} + +// MustNil cleans up and fatals if err is not nil. +func MustNil(err error, closeFuns ...func()) { + if err != nil { + for _, f := range closeFuns { + f() + } + log.Fatalf(errors.ErrorStack(err)) + } +} + +// Call executes a function and checks the returned err. +func Call(fn func() error) { + err := fn() + if err != nil { + log.Error(errors.ErrorStack(err)) + } +} + +// Log logs the error if it is not nil. +func Log(err error) { + if err != nil { + log.Error(errors.ErrorStack(err)) + } +} diff --git a/terror/terror_test.go b/terror/terror_test.go new file mode 100644 index 000000000..fe93ef4a9 --- /dev/null +++ b/terror/terror_test.go @@ -0,0 +1,163 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package terror + +import ( + "encoding/json" + "strings" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testTErrorSuite{}) + +type testTErrorSuite struct { +} + +func (s *testTErrorSuite) TestErrCode(c *C) { + c.Assert(CodeMissConnectionID, Equals, ErrCode(1)) + c.Assert(CodeResultUndetermined, Equals, ErrCode(2)) +} + +func (s *testTErrorSuite) TestTError(c *C) { + defer testleak.AfterTest(c)() + c.Assert(ClassParser.String(), Not(Equals), "") + c.Assert(ClassOptimizer.String(), Not(Equals), "") + c.Assert(ClassKV.String(), Not(Equals), "") + c.Assert(ClassServer.String(), Not(Equals), "") + + parserErr := ClassParser.New(ErrCode(1), "error 1") + c.Assert(parserErr.Error(), Not(Equals), "") + c.Assert(ClassParser.EqualClass(parserErr), IsTrue) + c.Assert(ClassParser.NotEqualClass(parserErr), IsFalse) + + c.Assert(ClassOptimizer.EqualClass(parserErr), IsFalse) + optimizerErr := ClassOptimizer.New(ErrCode(2), "abc") + c.Assert(ClassOptimizer.EqualClass(errors.New("abc")), IsFalse) + c.Assert(ClassOptimizer.EqualClass(nil), IsFalse) + c.Assert(optimizerErr.Equal(optimizerErr.GenWithStack("def")), IsTrue) + c.Assert(optimizerErr.Equal(nil), IsFalse) + c.Assert(optimizerErr.Equal(errors.New("abc")), IsFalse) + + // Test case for FastGen. + c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def")), IsTrue) + c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def: %s", "def")), IsTrue) + kvErr := ClassKV.New(1062, "key already exist") + e := kvErr.FastGen("Duplicate entry '%d' for key 'PRIMARY'", 1) + c.Assert(e.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'") + kvMySQLErrCodes := map[ErrCode]uint16{ + 1062: uint16(1062), + } + ErrClassToMySQLCodes[ClassKV] = kvMySQLErrCodes + sqlErr := errors.Cause(e).(*Error).ToSQLError() + c.Assert(sqlErr.Message, Equals, "Duplicate entry '1' for key 'PRIMARY'") + c.Assert(sqlErr.Code, Equals, uint16(1062)) + + err := errors.Trace(ErrCritical.GenWithStackByArgs("test")) + c.Assert(ErrCritical.Equal(err), IsTrue) + + err = errors.Trace(ErrCritical) + c.Assert(ErrCritical.Equal(err), IsTrue) +} + +func (s *testTErrorSuite) TestJson(c *C) { + prevTErr := &Error{ + class: ClassTable, + code: CodeExecResultIsEmpty, + message: "json test", + } + buf, err := json.Marshal(prevTErr) + c.Assert(err, IsNil) + var curTErr Error + err = json.Unmarshal(buf, &curTErr) + c.Assert(err, IsNil) + isEqual := prevTErr.Equal(&curTErr) + c.Assert(isEqual, IsTrue) +} + +var predefinedErr = ClassExecutor.New(ErrCode(123), "predefiend error") + +func example() error { + err := call() + return errors.Trace(err) +} + +func call() error { + return predefinedErr.GenWithStack("error message:%s", "abc") +} + +func (s *testTErrorSuite) TestTraceAndLocation(c *C) { + defer testleak.AfterTest(c)() + err := example() + stack := errors.ErrorStack(err) + lines := strings.Split(stack, "\n") + c.Assert(len(lines), Equals, 23) + var containTerr bool + for _, v := range lines { + if strings.Contains(v, "terror_test.go") { + containTerr = true + break + } + } + c.Assert(containTerr, IsTrue) +} + +func (s *testTErrorSuite) TestErrorEqual(c *C) { + defer testleak.AfterTest(c)() + e1 := errors.New("test error") + c.Assert(e1, NotNil) + + e2 := errors.Trace(e1) + c.Assert(e2, NotNil) + + e3 := errors.Trace(e2) + c.Assert(e3, NotNil) + + c.Assert(errors.Cause(e2), Equals, e1) + c.Assert(errors.Cause(e3), Equals, e1) + c.Assert(errors.Cause(e2), Equals, errors.Cause(e3)) + + e4 := errors.New("test error") + c.Assert(errors.Cause(e4), Not(Equals), e1) + + e5 := errors.Errorf("test error") + c.Assert(errors.Cause(e5), Not(Equals), e1) + + c.Assert(ErrorEqual(e1, e2), IsTrue) + c.Assert(ErrorEqual(e1, e3), IsTrue) + c.Assert(ErrorEqual(e1, e4), IsTrue) + c.Assert(ErrorEqual(e1, e5), IsTrue) + + var e6 error + + c.Assert(ErrorEqual(nil, nil), IsTrue) + c.Assert(ErrorNotEqual(e1, e6), IsTrue) + code1 := ErrCode(1) + code2 := ErrCode(2) + te1 := ClassParser.New(code1, "abc") + te2 := ClassParser.New(code1, "def") + te3 := ClassKV.New(code1, "abc") + te4 := ClassKV.New(code2, "abc") + c.Assert(ErrorEqual(te1, te2), IsTrue) + c.Assert(ErrorEqual(te1, te3), IsFalse) + c.Assert(ErrorEqual(te3, te4), IsFalse) +} diff --git a/types/etc.go b/types/etc.go new file mode 100644 index 000000000..d7ee3a6ff --- /dev/null +++ b/types/etc.go @@ -0,0 +1,258 @@ +// Copyright 2014 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/terror" +) + +// IsTypeBlob returns a boolean indicating whether the tp is a blob type. +func IsTypeBlob(tp byte) bool { + switch tp { + case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob: + return true + default: + return false + } +} + +// IsTypeChar returns a boolean indicating +// whether the tp is the char type like a string type or a varchar type. +func IsTypeChar(tp byte) bool { + return tp == mysql.TypeString || tp == mysql.TypeVarchar +} + +// IsTypeVarchar returns a boolean indicating +// whether the tp is the varchar type like a varstring type or a varchar type. +func IsTypeVarchar(tp byte) bool { + return tp == mysql.TypeVarString || tp == mysql.TypeVarchar +} + +// IsTypeUnspecified returns a boolean indicating whether the tp is the Unspecified type. +func IsTypeUnspecified(tp byte) bool { + return tp == mysql.TypeUnspecified +} + +// IsTypePrefixable returns a boolean indicating +// whether an index on a column with the tp can be defined with a prefix. +func IsTypePrefixable(tp byte) bool { + return IsTypeBlob(tp) || IsTypeChar(tp) +} + +// IsTypeFractionable returns a boolean indicating +// whether the tp can has time fraction. +func IsTypeFractionable(tp byte) bool { + return tp == mysql.TypeDatetime || tp == mysql.TypeDuration || tp == mysql.TypeTimestamp +} + +// IsTypeTime returns a boolean indicating +// whether the tp is time type like datetime, date or timestamp. +func IsTypeTime(tp byte) bool { + return tp == mysql.TypeDatetime || tp == mysql.TypeDate || tp == mysql.TypeTimestamp +} + +// IsTypeNumeric returns a boolean indicating whether the tp is numeric type. +func IsTypeNumeric(tp byte) bool { + switch tp { + case mysql.TypeBit, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeNewDecimal, + mysql.TypeDecimal, mysql.TypeFloat, mysql.TypeDouble, mysql.TypeShort: + return true + } + return false +} + +// IsTemporalWithDate returns a boolean indicating +// whether the tp is time type with date. +func IsTemporalWithDate(tp byte) bool { + return IsTypeTime(tp) +} + +// IsString returns a boolean indicating +// whether the field type is a string type. +func IsString(tp byte) bool { + return IsTypeChar(tp) || IsTypeBlob(tp) || IsTypeVarchar(tp) || IsTypeUnspecified(tp) +} + +var type2Str = map[byte]string{ + mysql.TypeBit: "bit", + mysql.TypeBlob: "text", + mysql.TypeDate: "date", + mysql.TypeDatetime: "datetime", + mysql.TypeDecimal: "unspecified", + mysql.TypeNewDecimal: "decimal", + mysql.TypeDouble: "double", + mysql.TypeEnum: "enum", + mysql.TypeFloat: "float", + mysql.TypeGeometry: "geometry", + mysql.TypeInt24: "mediumint", + mysql.TypeJSON: "json", + mysql.TypeLong: "int", + mysql.TypeLonglong: "bigint", + mysql.TypeLongBlob: "longtext", + mysql.TypeMediumBlob: "mediumtext", + mysql.TypeNull: "null", + mysql.TypeSet: "set", + mysql.TypeShort: "smallint", + mysql.TypeString: "char", + mysql.TypeDuration: "time", + mysql.TypeTimestamp: "timestamp", + mysql.TypeTiny: "tinyint", + mysql.TypeTinyBlob: "tinytext", + mysql.TypeVarchar: "varchar", + mysql.TypeVarString: "var_string", + mysql.TypeYear: "year", +} + +var kind2Str = map[byte]string{ + KindNull: "null", + KindInt64: "bigint", + KindUint64: "unsigned bigint", + KindFloat32: "float", + KindFloat64: "double", + KindString: "char", + KindBytes: "bytes", + KindBinaryLiteral: "bit/hex literal", + KindMysqlDecimal: "decimal", + KindMysqlDuration: "time", + KindMysqlEnum: "enum", + KindMysqlBit: "bit", + KindMysqlSet: "set", + KindMysqlTime: "datetime", + KindInterface: "interface", + KindMinNotNull: "min_not_null", + KindMaxValue: "max_value", + KindRaw: "raw", + KindMysqlJSON: "json", +} + +// TypeStr converts tp to a string. +func TypeStr(tp byte) (r string) { + return type2Str[tp] +} + +// KindStr converts kind to a string. +func KindStr(kind byte) (r string) { + return kind2Str[kind] +} + +// TypeToStr converts a field to a string. +// It is used for converting Text to Blob, +// or converting Char to Binary. +// Args: +// tp: type enum +// cs: charset +func TypeToStr(tp byte, cs string) (r string) { + ts := type2Str[tp] + if cs != "binary" { + return ts + } + if IsTypeBlob(tp) { + ts = strings.Replace(ts, "text", "blob", 1) + } else if IsTypeChar(tp) { + ts = strings.Replace(ts, "char", "binary", 1) + } + return ts +} + +// InvOp2 returns an invalid operation error. +func InvOp2(x, y interface{}, o opcode.Op) (interface{}, error) { + return nil, errors.Errorf("Invalid operation: %v %v %v (mismatched types %T and %T)", x, o, y, x, y) +} + +// IsTypeTemporal checks if a type is a temporal type. +func IsTypeTemporal(tp byte) bool { + switch tp { + case mysql.TypeDuration, mysql.TypeDatetime, mysql.TypeTimestamp, + mysql.TypeDate, mysql.TypeNewDate: + return true + } + return false +} + +// Kind constants. +const ( + KindNull byte = 0 + KindInt64 byte = 1 + KindUint64 byte = 2 + KindFloat32 byte = 3 + KindFloat64 byte = 4 + KindString byte = 5 + KindBytes byte = 6 + KindBinaryLiteral byte = 7 // Used for BIT / HEX literals. + KindMysqlDecimal byte = 8 + KindMysqlDuration byte = 9 + KindMysqlEnum byte = 10 + KindMysqlBit byte = 11 // Used for BIT table column values. + KindMysqlSet byte = 12 + KindMysqlTime byte = 13 + KindInterface byte = 14 + KindMinNotNull byte = 15 + KindMaxValue byte = 16 + KindRaw byte = 17 + KindMysqlJSON byte = 18 +) + +var ( + dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} +) + +// RoundMode is the type for round mode. +type RoundMode string + +// constant values. +const ( + ten0 = 1 + ten1 = 10 + ten2 = 100 + ten3 = 1000 + ten4 = 10000 + ten5 = 100000 + ten6 = 1000000 + ten7 = 10000000 + ten8 = 100000000 + ten9 = 1000000000 + + maxWordBufLen = 9 // A MyDecimal holds 9 words. + digitsPerWord = 9 // A word holds 9 digits. + wordSize = 4 // A word is 4 bytes int32. + digMask = ten8 + wordBase = ten9 + wordMax = wordBase - 1 + notFixedDec = 31 + + DivFracIncr = 4 + + // ModeHalfEven rounds normally. + ModeHalfEven RoundMode = "ModeHalfEven" + // Truncate just truncates the decimal. + ModeTruncate RoundMode = "Truncate" + // Ceiling is not supported now. + modeCeiling RoundMode = "Ceiling" +) + +const ( + codeInvalidDefault = terror.ErrCode(mysql.ErrInvalidDefault) +) + +// ErrInvalidDefault is returned when meet a invalid default value. +var ErrInvalidDefault = terror.ClassTypes.New(codeInvalidDefault, "Invalid default value for '%s'") diff --git a/types/eval_type.go b/types/eval_type.go new file mode 100644 index 000000000..47775953d --- /dev/null +++ b/types/eval_type.go @@ -0,0 +1,42 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +// EvalType indicates the specified types that arguments and result of a built-in function should be. +type EvalType byte + +const ( + // ETInt represents type INT in evaluation. + ETInt EvalType = iota + // ETReal represents type REAL in evaluation. + ETReal + // ETDecimal represents type DECIMAL in evaluation. + ETDecimal + // ETString represents type STRING in evaluation. + ETString + // ETDatetime represents type DATETIME in evaluation. + ETDatetime + // ETTimestamp represents type TIMESTAMP in evaluation. + ETTimestamp + // ETDuration represents type DURATION in evaluation. + ETDuration + // ETJson represents type JSON in evaluation. + ETJson +) + +// IsStringKind returns true for ETString, ETDatetime, ETTimestamp, ETDuration, ETJson EvalTypes. +func (et EvalType) IsStringKind() bool { + return et == ETString || et == ETDatetime || + et == ETTimestamp || et == ETDuration || et == ETJson +} diff --git a/types/field_type.go b/types/field_type.go new file mode 100644 index 000000000..4b299cdb6 --- /dev/null +++ b/types/field_type.go @@ -0,0 +1,258 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "fmt" + "io" + "strings" + + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/format" + "github.com/pingcap/parser/mysql" +) + +// UnspecifiedLength is unspecified length. +const ( + UnspecifiedLength = -1 +) + +// FieldType records field type information. +type FieldType struct { + Tp byte + Flag uint + Flen int + Decimal int + Charset string + Collate string + // Elems is the element list for enum and set type. + Elems []string +} + +// NewFieldType returns a FieldType, +// with a type and other information about field type. +func NewFieldType(tp byte) *FieldType { + return &FieldType{ + Tp: tp, + Flen: UnspecifiedLength, + Decimal: UnspecifiedLength, + } +} + +// Equal checks whether two FieldType objects are equal. +func (ft *FieldType) Equal(other *FieldType) bool { + // We do not need to compare whole `ft.Flag == other.Flag` when wrapping cast upon an Expression. + // but need compare unsigned_flag of ft.Flag. + partialEqual := ft.Tp == other.Tp && + ft.Flen == other.Flen && + ft.Decimal == other.Decimal && + ft.Charset == other.Charset && + ft.Collate == other.Collate && + mysql.HasUnsignedFlag(ft.Flag) == mysql.HasUnsignedFlag(other.Flag) + if !partialEqual || len(ft.Elems) != len(other.Elems) { + return false + } + for i := range ft.Elems { + if ft.Elems[i] != other.Elems[i] { + return false + } + } + return true +} + +// EvalType gets the type in evaluation. +func (ft *FieldType) EvalType() EvalType { + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, + mysql.TypeBit, mysql.TypeYear: + return ETInt + case mysql.TypeFloat, mysql.TypeDouble: + return ETReal + case mysql.TypeNewDecimal: + return ETDecimal + case mysql.TypeDate, mysql.TypeDatetime: + return ETDatetime + case mysql.TypeTimestamp: + return ETTimestamp + case mysql.TypeDuration: + return ETDuration + case mysql.TypeJSON: + return ETJson + } + return ETString +} + +// Hybrid checks whether a type is a hybrid type, which can represent different types of value in specific context. +func (ft *FieldType) Hybrid() bool { + return ft.Tp == mysql.TypeEnum || ft.Tp == mysql.TypeBit || ft.Tp == mysql.TypeSet +} + +// Init initializes the FieldType data. +func (ft *FieldType) Init(tp byte) { + ft.Tp = tp + ft.Flen = UnspecifiedLength + ft.Decimal = UnspecifiedLength +} + +// CompactStr only considers Tp/CharsetBin/Flen/Deimal. +// This is used for showing column type in infoschema. +func (ft *FieldType) CompactStr() string { + ts := TypeToStr(ft.Tp, ft.Charset) + suffix := "" + + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimal(ft.Tp) + isDecimalNotDefault := ft.Decimal != defaultDecimal && ft.Decimal != 0 && ft.Decimal != UnspecifiedLength + + // displayFlen and displayDecimal are flen and decimal values with `-1` substituted with default value. + displayFlen, displayDecimal := ft.Flen, ft.Decimal + if displayFlen == 0 || displayFlen == UnspecifiedLength { + displayFlen = defaultFlen + } + if displayDecimal == 0 || displayDecimal == UnspecifiedLength { + displayDecimal = defaultDecimal + } + + switch ft.Tp { + case mysql.TypeEnum, mysql.TypeSet: + // Format is ENUM ('e1', 'e2') or SET ('e1', 'e2') + es := make([]string, 0, len(ft.Elems)) + for _, e := range ft.Elems { + e = format.OutputFormat(e) + es = append(es, e) + } + suffix = fmt.Sprintf("('%s')", strings.Join(es, "','")) + case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration: + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d)", displayDecimal) + } + case mysql.TypeDouble, mysql.TypeFloat: + // 1. Flen Not Default, Decimal Not Default -> Valid + // 2. Flen Not Default, Decimal Default (-1) -> Invalid + // 3. Flen Default, Decimal Not Default -> Valid + // 4. Flen Default, Decimal Default -> Valid (hide) + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + } + case mysql.TypeNewDecimal: + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + case mysql.TypeBit, mysql.TypeShort, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString: + // Flen is always shown. + suffix = fmt.Sprintf("(%d)", displayFlen) + } + return ts + suffix +} + +// InfoSchemaStr joins the CompactStr with unsigned flag and +// returns a string. +func (ft *FieldType) InfoSchemaStr() string { + suffix := "" + if mysql.HasUnsignedFlag(ft.Flag) { + suffix = " unsigned" + } + return ft.CompactStr() + suffix +} + +// String joins the information of FieldType and returns a string. +// Note: when flen or decimal is unspecified, this function will use the default value instead of -1. +func (ft *FieldType) String() string { + strs := []string{ft.CompactStr()} + if mysql.HasUnsignedFlag(ft.Flag) { + strs = append(strs, "UNSIGNED") + } + if mysql.HasZerofillFlag(ft.Flag) { + strs = append(strs, "ZEROFILL") + } + if mysql.HasBinaryFlag(ft.Flag) && ft.Tp != mysql.TypeString { + strs = append(strs, "BINARY") + } + + if IsTypeChar(ft.Tp) || IsTypeBlob(ft.Tp) { + if ft.Charset != "" && ft.Charset != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("CHARACTER SET %s", ft.Charset)) + } + if ft.Collate != "" && ft.Collate != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("COLLATE %s", ft.Collate)) + } + } + + return strings.Join(strs, " ") +} + +// FormatAsCastType is used for write AST back to string. +func (ft *FieldType) FormatAsCastType(w io.Writer) { + switch ft.Tp { + case mysql.TypeVarString: + if ft.Charset == charset.CharsetBin && ft.Collate == charset.CollationBin { + fmt.Fprint(w, "BINARY") + } else { + fmt.Fprint(w, "CHAR") + } + if ft.Flen != UnspecifiedLength { + fmt.Fprintf(w, "(%d)", ft.Flen) + } + if ft.Flag&mysql.BinaryFlag != 0 { + fmt.Fprint(w, " BINARY") + } + if ft.Charset != charset.CharsetBin && ft.Charset != charset.CharsetUTF8 { + fmt.Fprintf(w, " %s", ft.Charset) + } + case mysql.TypeDate: + fmt.Fprint(w, "DATE") + case mysql.TypeDatetime: + fmt.Fprint(w, "DATETIME") + if ft.Decimal > 0 { + fmt.Fprintf(w, "(%d)", ft.Decimal) + } + case mysql.TypeNewDecimal: + fmt.Fprint(w, "DECIMAL") + if ft.Flen > 0 && ft.Decimal > 0 { + fmt.Fprintf(w, "(%d, %d)", ft.Flen, ft.Decimal) + } else if ft.Flen > 0 { + fmt.Fprintf(w, "(%d)", ft.Flen) + } + case mysql.TypeDuration: + fmt.Fprint(w, "TIME") + if ft.Decimal > 0 { + fmt.Fprintf(w, "(%d)", ft.Decimal) + } + case mysql.TypeLonglong: + if ft.Flag&mysql.UnsignedFlag != 0 { + fmt.Fprint(w, "UNSIGNED") + } else { + fmt.Fprint(w, "SIGNED") + } + case mysql.TypeJSON: + fmt.Fprint(w, "JSON") + } +} + +// VarStorageLen indicates this column is a variable length column. +const VarStorageLen = -1 + +// StorageLength is the length of stored value for the type. +func (ft *FieldType) StorageLength() int { + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, + mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeFloat, mysql.TypeYear, mysql.TypeDuration, + mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp, mysql.TypeEnum, mysql.TypeSet, + mysql.TypeBit: + // This may not be the accurate length, because we may encode them as varint. + return 8 + case mysql.TypeNewDecimal: + precision, frac := ft.Flen-ft.Decimal, ft.Decimal + return precision/digitsPerWord*wordSize + dig2bytes[precision%digitsPerWord] + frac/digitsPerWord*wordSize + dig2bytes[frac%digitsPerWord] + default: + return VarStorageLen + } +} diff --git a/yy_parser.go b/yy_parser.go new file mode 100644 index 000000000..0507d7d71 --- /dev/null +++ b/yy_parser.go @@ -0,0 +1,239 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "math" + "regexp" + "strconv" + "unicode" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" +) + +const ( + codeErrParse = terror.ErrCode(mysql.ErrParse) + codeErrSyntax = terror.ErrCode(mysql.ErrSyntax) +) + +var ( + // ErrSyntax returns for sql syntax error. + ErrSyntax = terror.ClassParser.New(codeErrSyntax, mysql.MySQLErrName[mysql.ErrSyntax]) + // ErrParse returns for sql parse error. + ErrParse = terror.ClassParser.New(codeErrParse, mysql.MySQLErrName[mysql.ErrParse]) + // SpecFieldPattern special result field pattern + SpecFieldPattern = regexp.MustCompile(`(\/\*!(M?[0-9]{5,6})?|\*\/)`) + specCodePattern = regexp.MustCompile(`\/\*!(M?[0-9]{5,6})?([^*]|\*+[^*/])*\*+\/`) + specCodeStart = regexp.MustCompile(`^\/\*!(M?[0-9]{5,6})?[ \t]*`) + specCodeEnd = regexp.MustCompile(`[ \t]*\*\/$`) +) + +func init() { + parserMySQLErrCodes := map[terror.ErrCode]uint16{ + codeErrSyntax: mysql.ErrSyntax, + codeErrParse: mysql.ErrParse, + } + terror.ErrClassToMySQLCodes[terror.ClassParser] = parserMySQLErrCodes +} + +// TrimComment trim comment for special comment code of MySQL. +func TrimComment(txt string) string { + txt = specCodeStart.ReplaceAllString(txt, "") + return specCodeEnd.ReplaceAllString(txt, "") +} + +// Parser represents a parser instance. Some temporary objects are stored in it to reduce object allocation during Parse function. +type Parser struct { + charset string + collation string + result []ast.StmtNode + src string + lexer Scanner + + // the following fields are used by yyParse to reduce allocation. + cache []yySymType + yylval yySymType + yyVAL yySymType +} + +type stmtTexter interface { + stmtText() string +} + +// New returns a Parser object. +func New() *Parser { + return &Parser{ + cache: make([]yySymType, 200), + } +} + +// Parse parses a query string to raw ast.StmtNode. +// If charset or collation is "", default charset and collation will be used. +func (parser *Parser) Parse(sql, charset, collation string) ([]ast.StmtNode, error) { + if charset == "" { + charset = mysql.DefaultCharset + } + if collation == "" { + collation = mysql.DefaultCollationName + } + parser.charset = charset + parser.collation = collation + parser.src = sql + parser.result = parser.result[:0] + + var l yyLexer + parser.lexer.reset(sql) + l = &parser.lexer + yyParse(l, parser) + + if len(l.Errors()) != 0 { + return nil, errors.Trace(l.Errors()[0]) + } + for _, stmt := range parser.result { + ast.SetFlag(stmt) + } + return parser.result, nil +} + +// ParseOneStmt parses a query and returns an ast.StmtNode. +// The query must have one statement, otherwise ErrSyntax is returned. +func (parser *Parser) ParseOneStmt(sql, charset, collation string) (ast.StmtNode, error) { + stmts, err := parser.Parse(sql, charset, collation) + if err != nil { + return nil, errors.Trace(err) + } + if len(stmts) != 1 { + return nil, ErrSyntax + } + ast.SetFlag(stmts[0]) + return stmts[0], nil +} + +// SetSQLMode sets the SQL mode for parser. +func (parser *Parser) SetSQLMode(mode mysql.SQLMode) { + parser.lexer.SetSQLMode(mode) +} + +// ParseErrorWith returns "You have a syntax error near..." error message compatible with mysql. +func ParseErrorWith(errstr string, lineno int) error { + if len(errstr) > mysql.ErrTextLength { + errstr = errstr[:mysql.ErrTextLength] + } + return ErrParse.GenWithStackByArgs(mysql.MySQLErrName[mysql.ErrSyntax], errstr, lineno) +} + +// The select statement is not at the end of the whole statement, if the last +// field text was set from its offset to the end of the src string, update +// the last field text. +func (parser *Parser) setLastSelectFieldText(st *ast.SelectStmt, lastEnd int) { + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Offset+len(lastField.Text()) >= len(parser.src)-1 { + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } +} + +func (parser *Parser) startOffset(v *yySymType) int { + return v.offset +} + +func (parser *Parser) endOffset(v *yySymType) int { + offset := v.offset + for offset > 0 && unicode.IsSpace(rune(parser.src[offset-1])) { + offset-- + } + return offset +} + +func toInt(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseUint(str, 10, 64) + if err != nil { + e := err.(*strconv.NumError) + if e.Err == strconv.ErrRange { + // TODO: toDecimal maybe out of range still. + // This kind of error should be throw to higher level, because truncated data maybe legal. + // For example, this SQL returns error: + // create table test (id decimal(30, 0)); + // insert into test values(123456789012345678901234567890123094839045793405723406801943850); + // While this SQL: + // select 1234567890123456789012345678901230948390457934057234068019438509023041874359081325875128590860234789847359871045943057; + // get value 99999999999999999999999999999999999999999999999999999999999999999 + return toDecimal(l, lval, str) + } + l.Errorf("integer literal: %v", err) + return int(unicode.ReplacementChar) + } + + switch { + case n < math.MaxInt64: + lval.item = int64(n) + default: + lval.item = n + } + return intLit +} + +func toDecimal(l yyLexer, lval *yySymType, str string) int { + dec, err := ast.NewDecimal(str) + if err != nil { + l.Errorf("decimal literal: %v", err) + } + lval.item = dec + return decLit +} + +func toFloat(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseFloat(str, 64) + if err != nil { + l.Errorf("float literal: %v", err) + return int(unicode.ReplacementChar) + } + + lval.item = n + return floatLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html +func toHex(l yyLexer, lval *yySymType, str string) int { + h, err := ast.NewHexLiteral(str) + if err != nil { + l.Errorf("hex literal: %v", err) + return int(unicode.ReplacementChar) + } + lval.item = h + return hexLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/bit-type.html +func toBit(l yyLexer, lval *yySymType, str string) int { + b, err := ast.NewBitLiteral(str) + if err != nil { + l.Errorf("bit literal: %v", err) + return int(unicode.ReplacementChar) + } + lval.item = b + return bitLit +} + +func getUint64FromNUM(num interface{}) uint64 { + switch v := num.(type) { + case int64: + return uint64(v) + case uint64: + return v + } + return 0 +} From 0e2d75d9367f3492dca5899f7bb510f27f2f1d65 Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Tue, 23 Oct 2018 19:36:28 +0800 Subject: [PATCH 2/5] update makefile --- Makefile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 722622357..887f220ea 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,11 @@ -.PHONEY: all parser parserlib goyacc +.PHONEY: all parser goyacc -all: parser - -parserlib: parser.go +all: parser.go parser.go: parser.y make parser -parser: bin/goyacc +parser: goyacc bin/goyacc -o /dev/null parser.y bin/goyacc -o parser.go parser.y 2>&1 | egrep "(shift|reduce)/reduce" | awk '{print} END {if (NR > 0) {print "Find conflict in parser.y. Please check y.output for more information."; exit 1;}}' rm -f y.output @@ -23,5 +21,5 @@ parser: bin/goyacc @awk 'BEGIN{print "// Code generated by goyacc"} {print $0}' parser.go > tmp_parser.go && mv tmp_parser.go parser.go; -bin/goyacc: +goyacc: go build -o bin/goyacc goyacc/main.go From c853949523980a1077ec4753de37c865c2e4a8dc Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Wed, 24 Oct 2018 15:33:12 +0800 Subject: [PATCH 3/5] update etc.go --- types/etc.go | 146 --------------------------------------------------- 1 file changed, 146 deletions(-) diff --git a/types/etc.go b/types/etc.go index d7ee3a6ff..84b2966c5 100644 --- a/types/etc.go +++ b/types/etc.go @@ -20,9 +20,7 @@ package types import ( "strings" - "github.com/pingcap/errors" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/opcode" "github.com/pingcap/parser/terror" ) @@ -42,57 +40,6 @@ func IsTypeChar(tp byte) bool { return tp == mysql.TypeString || tp == mysql.TypeVarchar } -// IsTypeVarchar returns a boolean indicating -// whether the tp is the varchar type like a varstring type or a varchar type. -func IsTypeVarchar(tp byte) bool { - return tp == mysql.TypeVarString || tp == mysql.TypeVarchar -} - -// IsTypeUnspecified returns a boolean indicating whether the tp is the Unspecified type. -func IsTypeUnspecified(tp byte) bool { - return tp == mysql.TypeUnspecified -} - -// IsTypePrefixable returns a boolean indicating -// whether an index on a column with the tp can be defined with a prefix. -func IsTypePrefixable(tp byte) bool { - return IsTypeBlob(tp) || IsTypeChar(tp) -} - -// IsTypeFractionable returns a boolean indicating -// whether the tp can has time fraction. -func IsTypeFractionable(tp byte) bool { - return tp == mysql.TypeDatetime || tp == mysql.TypeDuration || tp == mysql.TypeTimestamp -} - -// IsTypeTime returns a boolean indicating -// whether the tp is time type like datetime, date or timestamp. -func IsTypeTime(tp byte) bool { - return tp == mysql.TypeDatetime || tp == mysql.TypeDate || tp == mysql.TypeTimestamp -} - -// IsTypeNumeric returns a boolean indicating whether the tp is numeric type. -func IsTypeNumeric(tp byte) bool { - switch tp { - case mysql.TypeBit, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeNewDecimal, - mysql.TypeDecimal, mysql.TypeFloat, mysql.TypeDouble, mysql.TypeShort: - return true - } - return false -} - -// IsTemporalWithDate returns a boolean indicating -// whether the tp is time type with date. -func IsTemporalWithDate(tp byte) bool { - return IsTypeTime(tp) -} - -// IsString returns a boolean indicating -// whether the field type is a string type. -func IsString(tp byte) bool { - return IsTypeChar(tp) || IsTypeBlob(tp) || IsTypeVarchar(tp) || IsTypeUnspecified(tp) -} - var type2Str = map[byte]string{ mysql.TypeBit: "bit", mysql.TypeBlob: "text", @@ -123,38 +70,11 @@ var type2Str = map[byte]string{ mysql.TypeYear: "year", } -var kind2Str = map[byte]string{ - KindNull: "null", - KindInt64: "bigint", - KindUint64: "unsigned bigint", - KindFloat32: "float", - KindFloat64: "double", - KindString: "char", - KindBytes: "bytes", - KindBinaryLiteral: "bit/hex literal", - KindMysqlDecimal: "decimal", - KindMysqlDuration: "time", - KindMysqlEnum: "enum", - KindMysqlBit: "bit", - KindMysqlSet: "set", - KindMysqlTime: "datetime", - KindInterface: "interface", - KindMinNotNull: "min_not_null", - KindMaxValue: "max_value", - KindRaw: "raw", - KindMysqlJSON: "json", -} - // TypeStr converts tp to a string. func TypeStr(tp byte) (r string) { return type2Str[tp] } -// KindStr converts kind to a string. -func KindStr(kind byte) (r string) { - return kind2Str[kind] -} - // TypeToStr converts a field to a string. // It is used for converting Text to Blob, // or converting Char to Binary. @@ -174,80 +94,14 @@ func TypeToStr(tp byte, cs string) (r string) { return ts } -// InvOp2 returns an invalid operation error. -func InvOp2(x, y interface{}, o opcode.Op) (interface{}, error) { - return nil, errors.Errorf("Invalid operation: %v %v %v (mismatched types %T and %T)", x, o, y, x, y) -} - -// IsTypeTemporal checks if a type is a temporal type. -func IsTypeTemporal(tp byte) bool { - switch tp { - case mysql.TypeDuration, mysql.TypeDatetime, mysql.TypeTimestamp, - mysql.TypeDate, mysql.TypeNewDate: - return true - } - return false -} - -// Kind constants. -const ( - KindNull byte = 0 - KindInt64 byte = 1 - KindUint64 byte = 2 - KindFloat32 byte = 3 - KindFloat64 byte = 4 - KindString byte = 5 - KindBytes byte = 6 - KindBinaryLiteral byte = 7 // Used for BIT / HEX literals. - KindMysqlDecimal byte = 8 - KindMysqlDuration byte = 9 - KindMysqlEnum byte = 10 - KindMysqlBit byte = 11 // Used for BIT table column values. - KindMysqlSet byte = 12 - KindMysqlTime byte = 13 - KindInterface byte = 14 - KindMinNotNull byte = 15 - KindMaxValue byte = 16 - KindRaw byte = 17 - KindMysqlJSON byte = 18 -) - var ( dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} ) -// RoundMode is the type for round mode. -type RoundMode string - // constant values. const ( - ten0 = 1 - ten1 = 10 - ten2 = 100 - ten3 = 1000 - ten4 = 10000 - ten5 = 100000 - ten6 = 1000000 - ten7 = 10000000 - ten8 = 100000000 - ten9 = 1000000000 - - maxWordBufLen = 9 // A MyDecimal holds 9 words. digitsPerWord = 9 // A word holds 9 digits. wordSize = 4 // A word is 4 bytes int32. - digMask = ten8 - wordBase = ten9 - wordMax = wordBase - 1 - notFixedDec = 31 - - DivFracIncr = 4 - - // ModeHalfEven rounds normally. - ModeHalfEven RoundMode = "ModeHalfEven" - // Truncate just truncates the decimal. - ModeTruncate RoundMode = "Truncate" - // Ceiling is not supported now. - modeCeiling RoundMode = "Ceiling" ) const ( From b4d79303ee27e116ec6c7b76fbf55d77c9d1ed96 Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Wed, 24 Oct 2018 15:55:30 +0800 Subject: [PATCH 4/5] update model.go --- model/model.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/model/model.go b/model/model.go index 76a5e357d..574d66132 100644 --- a/model/model.go +++ b/model/model.go @@ -566,7 +566,8 @@ func collationToProto(c string) int32 { return int32(mysql.DefaultCollationID) } -// GetTableColumnID gets a ID of a column with table ID -func GetTableColumnID(tableInfo *TableInfo, col *ColumnInfo) string { - return fmt.Sprintf("%d_%d", tableInfo.ID, col.ID) +// TableColumnID is composed by table ID and column ID. +type TableColumnID struct { + TableID int64 + ColumnID int64 } From e5c3c42627cf56f332bcb4d0a2e9d7a8cc96307b Mon Sep 17 00:00:00 2001 From: tiancaiamao Date: Wed, 24 Oct 2018 15:59:01 +0800 Subject: [PATCH 5/5] add parser.go --- model/model.go | 1 - parser.go | 11728 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 11728 insertions(+), 1 deletion(-) create mode 100644 parser.go diff --git a/model/model.go b/model/model.go index 574d66132..22891f9d2 100644 --- a/model/model.go +++ b/model/model.go @@ -15,7 +15,6 @@ package model import ( "encoding/json" - "fmt" "strings" "time" diff --git a/parser.go b/parser.go new file mode 100644 index 000000000..560f39ccd --- /dev/null +++ b/parser.go @@ -0,0 +1,11728 @@ +// Code generated by goyacc +// CAUTION: Generated file - DO NOT EDIT. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import __yyfmt__ "fmt" + +import ( + "strings" + + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/types" +) + +type yySymType struct { + yys int + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +type yyXError struct { + state, xsym int +} + +const ( + yyDefault = 57799 + yyEOFCode = 57344 + action = 57538 + add = 57359 + addDate = 57697 + admin = 57725 + after = 57539 + algorithm = 57541 + all = 57360 + alter = 57361 + always = 57540 + analyze = 57362 + and = 57363 + andand = 57354 + andnot = 57770 + any = 57542 + as = 57364 + asc = 57365 + ascii = 57543 + assignmentEq = 57771 + autoIncrement = 57544 + avg = 57546 + avgRowLength = 57545 + begin = 57547 + between = 57366 + bigIntType = 57367 + binaryType = 57368 + binlog = 57548 + bitAnd = 57698 + bitLit = 57769 + bitOr = 57699 + bitType = 57549 + bitXor = 57700 + blobType = 57369 + boolType = 57551 + booleanType = 57550 + both = 57370 + btree = 57552 + buckets = 57726 + builtinAddDate = 57740 + builtinBitAnd = 57741 + builtinBitOr = 57742 + builtinBitXor = 57743 + builtinCast = 57744 + builtinCount = 57745 + builtinCurDate = 57746 + builtinCurTime = 57747 + builtinDateAdd = 57748 + builtinDateSub = 57749 + builtinExtract = 57750 + builtinGroupConcat = 57751 + builtinMax = 57752 + builtinMin = 57753 + builtinNow = 57754 + builtinPosition = 57755 + builtinStddevPop = 57756 + builtinSubDate = 57757 + builtinSubstring = 57758 + builtinSum = 57759 + builtinSysDate = 57760 + builtinTrim = 57761 + builtinUser = 57762 + builtinVarPop = 57763 + builtinVarSamp = 57764 + by = 57371 + byteType = 57553 + cancel = 57727 + cascade = 57372 + cascaded = 57554 + caseKwd = 57373 + cast = 57701 + change = 57374 + charType = 57376 + character = 57375 + charsetKwd = 57555 + check = 57377 + checksum = 57556 + cleanup = 57557 + client = 57558 + coalesce = 57559 + collate = 57378 + collation = 57560 + column = 57379 + columns = 57561 + comment = 57562 + commit = 57563 + committed = 57564 + compact = 57565 + compressed = 57566 + compression = 57567 + connection = 57568 + consistent = 57569 + constraint = 57380 + convert = 57381 + copyKwd = 57702 + count = 57703 + create = 57382 + createTableSelect = 57791 + cross = 57383 + curTime = 57704 + currentDate = 57384 + currentTime = 57385 + currentTs = 57386 + currentUser = 57387 + data = 57571 + database = 57388 + databases = 57389 + dateAdd = 57705 + dateSub = 57706 + dateType = 57572 + datetimeType = 57573 + day = 57570 + dayHour = 57390 + dayMicrosecond = 57391 + dayMinute = 57392 + daySecond = 57393 + ddl = 57728 + deallocate = 57574 + decLit = 57766 + decimalType = 57394 + defaultKwd = 57395 + definer = 57575 + delayKeyWrite = 57576 + delayed = 57396 + deleteKwd = 57397 + desc = 57398 + describe = 57399 + disable = 57577 + distinct = 57400 + distinctRow = 57401 + div = 57402 + do = 57578 + doubleAtIdentifier = 57350 + doubleType = 57403 + drop = 57404 + dual = 57405 + duplicate = 57579 + dynamic = 57580 + elseKwd = 57406 + empty = 57784 + enable = 57581 + enclosed = 57407 + end = 57582 + engine = 57583 + engines = 57584 + enum = 57585 + eq = 57772 + yyErrCode = 57345 + escape = 57588 + escaped = 57408 + event = 57586 + events = 57587 + exclusive = 57589 + execute = 57590 + exists = 57409 + explain = 57410 + extract = 57707 + falseKwd = 57411 + fields = 57591 + first = 57592 + fixed = 57593 + floatLit = 57765 + floatType = 57412 + flush = 57594 + forKwd = 57413 + force = 57414 + foreign = 57415 + format = 57595 + from = 57416 + full = 57596 + fulltext = 57417 + function = 57597 + ge = 57773 + generated = 57418 + getFormat = 57708 + global = 57673 + grant = 57419 + grants = 57598 + group = 57420 + groupConcat = 57709 + hash = 57599 + having = 57421 + hexLit = 57768 + highPriority = 57422 + higherThanComma = 57798 + hintBegin = 57352 + hintEnd = 57353 + hour = 57600 + hourMicrosecond = 57423 + hourMinute = 57424 + hourSecond = 57425 + identSQLErrors = 57694 + identified = 57601 + identifier = 57346 + ifKwd = 57426 + ignore = 57427 + in = 57428 + index = 57429 + indexes = 57603 + infile = 57430 + inner = 57431 + inplace = 57710 + insert = 57436 + insertValues = 57789 + int1Type = 57438 + int2Type = 57439 + int3Type = 57440 + int4Type = 57441 + int8Type = 57442 + intLit = 57767 + intType = 57437 + integerType = 57432 + internal = 57711 + interval = 57433 + into = 57434 + invalid = 57351 + invoker = 57604 + is = 57435 + isolation = 57602 + job = 57730 + jobs = 57729 + join = 57443 + jsonType = 57605 + jss = 57775 + juss = 57776 + key = 57444 + keyBlockSize = 57606 + keys = 57445 + kill = 57446 + le = 57774 + leading = 57447 + left = 57448 + less = 57608 + level = 57609 + like = 57449 + limit = 57450 + lines = 57451 + load = 57452 + local = 57607 + localTime = 57453 + localTs = 57454 + lock = 57455 + long = 57526 + longblobType = 57456 + longtextType = 57457 + lowPriority = 57458 + lowerThanComma = 57797 + lowerThanCreateTableSelect = 57790 + lowerThanEq = 57795 + lowerThanInsertValues = 57788 + lowerThanIntervalKeyword = 57785 + lowerThanKey = 57792 + lowerThanOn = 57794 + lowerThanSetKeyword = 57787 + lowerThanStringLitToken = 57786 + lsh = 57777 + master = 57610 + max = 57713 + maxConnectionsPerHour = 57617 + maxExecutionTime = 57714 + maxQueriesPerHour = 57618 + maxRows = 57616 + maxUpdatesPerHour = 57619 + maxUserConnections = 57620 + maxValue = 57459 + mediumIntType = 57461 + mediumblobType = 57460 + mediumtextType = 57462 + merge = 57621 + microsecond = 57611 + min = 57712 + minRows = 57622 + minute = 57612 + minuteMicrosecond = 57463 + minuteSecond = 57464 + mod = 57465 + mode = 57613 + modify = 57614 + month = 57615 + names = 57623 + national = 57624 + natural = 57537 + neg = 57796 + neq = 57778 + neqSynonym = 57779 + no = 57625 + noWriteToBinLog = 57467 + none = 57626 + not = 57466 + not2 = 57783 + now = 57715 + null = 57468 + nulleq = 57780 + numericType = 57469 + nvarcharType = 57470 + odbcDateType = 57356 + odbcTimeType = 57357 + odbcTimestampType = 57358 + offset = 57627 + on = 57471 + only = 57628 + option = 57472 + or = 57473 + order = 57474 + outer = 57475 + packKeys = 57476 + paramMarker = 57781 + partition = 57477 + partitions = 57630 + password = 57629 + pipes = 57355 + pipesAsOr = 57631 + plugins = 57632 + position = 57716 + precisionType = 57478 + prepare = 57633 + primary = 57479 + privileges = 57634 + procedure = 57480 + process = 57635 + processlist = 57636 + profiles = 57637 + quarter = 57638 + queries = 57640 + query = 57639 + quick = 57641 + rangeKwd = 57482 + read = 57483 + realType = 57484 + recent = 57717 + recover = 57642 + redundant = 57643 + references = 57485 + regexpKwd = 57486 + reload = 57644 + rename = 57487 + repeat = 57488 + repeatable = 57645 + replace = 57489 + replication = 57646 + restrict = 57490 + reverse = 57647 + revoke = 57491 + right = 57492 + rlike = 57493 + rollback = 57648 + routine = 57649 + row = 57650 + rowCount = 57651 + rowFormat = 57652 + rsh = 57782 + second = 57653 + secondMicrosecond = 57494 + security = 57654 + selectKwd = 57495 + separator = 57655 + serializable = 57656 + session = 57657 + set = 57496 + shardRowIDBits = 57481 + share = 57658 + shared = 57659 + show = 57497 + signed = 57660 + singleAtIdentifier = 57349 + slave = 57661 + slow = 57662 + smallIntType = 57498 + snapshot = 57663 + some = 57672 + sql = 57499 + sqlCache = 57664 + sqlCalcFoundRows = 57500 + sqlNoCache = 57665 + start = 57666 + starting = 57501 + stats = 57731 + statsBuckets = 57734 + statsHealthy = 57735 + statsHistograms = 57733 + statsMeta = 57732 + statsPersistent = 57667 + status = 57668 + stored = 57504 + straightJoin = 57502 + stringLit = 57348 + subDate = 57718 + subpartition = 57669 + subpartitions = 57670 + substring = 57720 + sum = 57719 + super = 57671 + tableKwd = 57503 + tableRefPriority = 57793 + tables = 57674 + tablespace = 57675 + temporary = 57676 + temptable = 57677 + terminated = 57505 + textType = 57678 + than = 57679 + then = 57506 + tidb = 57736 + tidbHJ = 57737 + tidbINLJ = 57739 + tidbSMJ = 57738 + timeType = 57680 + timestampAdd = 57721 + timestampDiff = 57722 + timestampType = 57681 + tinyIntType = 57508 + tinyblobType = 57507 + tinytextType = 57509 + to = 57510 + top = 57723 + trace = 57682 + trailing = 57511 + transaction = 57683 + trigger = 57512 + triggers = 57684 + trim = 57724 + trueKwd = 57513 + truncate = 57685 + uncommitted = 57686 + undefined = 57689 + underscoreCS = 57347 + union = 57515 + unique = 57514 + unknown = 57687 + unlock = 57516 + unsigned = 57517 + update = 57518 + usage = 57519 + use = 57520 + user = 57688 + using = 57521 + utcDate = 57522 + utcTime = 57524 + utcTimestamp = 57523 + value = 57690 + values = 57525 + varbinaryType = 57528 + varcharType = 57527 + variables = 57691 + view = 57692 + virtual = 57529 + warnings = 57693 + week = 57695 + when = 57530 + where = 57531 + with = 57533 + write = 57532 + xor = 57534 + yearMonth = 57535 + yearType = 57696 + zerofill = 57536 + + yyMaxDepth = 200 + yyTabOfs = -1353 +) + +var ( + yyXLAT = map[int]int{ + 57344: 0, // $end (1158x) + 59: 1, // ';' (1157x) + 57562: 2, // comment (1050x) + 57544: 3, // autoIncrement (1024x) + 57539: 4, // after (988x) + 57592: 5, // first (988x) + 44: 6, // ',' (978x) + 57555: 7, // charsetKwd (913x) + 57606: 8, // keyBlockSize (899x) + 57583: 9, // engine (893x) + 57568: 10, // connection (886x) + 57629: 11, // password (886x) + 57660: 12, // signed (885x) + 57556: 13, // checksum (884x) + 57545: 14, // avgRowLength (883x) + 57567: 15, // compression (883x) + 57576: 16, // delayKeyWrite (883x) + 57616: 17, // maxRows (883x) + 57622: 18, // minRows (883x) + 57652: 19, // rowFormat (883x) + 57667: 20, // statsPersistent (883x) + 41: 21, // ')' (869x) + 57692: 22, // view (861x) + 57655: 23, // separator (853x) + 57668: 24, // status (853x) + 57674: 25, // tables (853x) + 57675: 26, // tablespace (851x) + 57561: 27, // columns (850x) + 57575: 28, // definer (849x) + 57591: 29, // fields (849x) + 57601: 30, // identified (849x) + 57714: 31, // maxExecutionTime (849x) + 57737: 32, // tidbHJ (849x) + 57739: 33, // tidbINLJ (849x) + 57738: 34, // tidbSMJ (849x) + 57696: 35, // yearType (849x) + 57570: 36, // day (848x) + 57600: 37, // hour (848x) + 57611: 38, // microsecond (848x) + 57612: 39, // minute (848x) + 57615: 40, // month (848x) + 57638: 41, // quarter (848x) + 57653: 42, // second (848x) + 57695: 43, // week (848x) + 57582: 44, // end (847x) + 57634: 45, // privileges (847x) + 57541: 46, // algorithm (846x) + 57590: 47, // execute (846x) + 57627: 48, // offset (846x) + 57633: 49, // prepare (846x) + 57573: 50, // datetimeType (845x) + 57572: 51, // dateType (845x) + 57602: 52, // isolation (845x) + 57607: 53, // local (845x) + 57630: 54, // partitions (845x) + 57669: 55, // subpartition (845x) + 57680: 56, // timeType (845x) + 57688: 57, // user (845x) + 57691: 58, // variables (845x) + 57586: 59, // event (844x) + 57599: 60, // hash (844x) + 57605: 61, // jsonType (844x) + 57635: 62, // process (844x) + 57636: 63, // processlist (844x) + 57639: 64, // query (844x) + 57644: 65, // reload (844x) + 57646: 66, // replication (844x) + 57671: 67, // super (844x) + 57687: 68, // unknown (844x) + 57690: 69, // value (844x) + 57725: 70, // admin (843x) + 57547: 71, // begin (843x) + 57548: 72, // binlog (843x) + 57726: 73, // buckets (843x) + 57563: 74, // commit (843x) + 57565: 75, // compact (843x) + 57566: 76, // compressed (843x) + 57702: 77, // copyKwd (843x) + 57728: 78, // ddl (843x) + 57574: 79, // deallocate (843x) + 57577: 80, // disable (843x) + 57578: 81, // do (843x) + 57580: 82, // dynamic (843x) + 57581: 83, // enable (843x) + 57593: 84, // fixed (843x) + 57594: 85, // flush (843x) + 57710: 86, // inplace (843x) + 57729: 87, // jobs (843x) + 57614: 88, // modify (843x) + 57625: 89, // no (843x) + 57643: 90, // redundant (843x) + 57648: 91, // rollback (843x) + 57649: 92, // routine (843x) + 57666: 93, // start (843x) + 57731: 94, // stats (843x) + 57670: 95, // subpartitions (843x) + 57681: 96, // timestampType (843x) + 57682: 97, // trace (843x) + 57685: 98, // truncate (843x) + 57538: 99, // action (842x) + 57540: 100, // always (842x) + 57549: 101, // bitType (842x) + 57550: 102, // booleanType (842x) + 57551: 103, // boolType (842x) + 57552: 104, // btree (842x) + 57727: 105, // cancel (842x) + 57554: 106, // cascaded (842x) + 57557: 107, // cleanup (842x) + 57558: 108, // client (842x) + 57560: 109, // collation (842x) + 57564: 110, // committed (842x) + 57569: 111, // consistent (842x) + 57571: 112, // data (842x) + 57579: 113, // duplicate (842x) + 57584: 114, // engines (842x) + 57585: 115, // enum (842x) + 57587: 116, // events (842x) + 57589: 117, // exclusive (842x) + 57596: 118, // full (842x) + 57597: 119, // function (842x) + 57673: 120, // global (842x) + 57598: 121, // grants (842x) + 57694: 122, // identSQLErrors (842x) + 57603: 123, // indexes (842x) + 57711: 124, // internal (842x) + 57604: 125, // invoker (842x) + 57730: 126, // job (842x) + 57608: 127, // less (842x) + 57609: 128, // level (842x) + 57610: 129, // master (842x) + 57617: 130, // maxConnectionsPerHour (842x) + 57618: 131, // maxQueriesPerHour (842x) + 57619: 132, // maxUpdatesPerHour (842x) + 57620: 133, // maxUserConnections (842x) + 57621: 134, // merge (842x) + 57613: 135, // mode (842x) + 57624: 136, // national (842x) + 57626: 137, // none (842x) + 57628: 138, // only (842x) + 57632: 139, // plugins (842x) + 57637: 140, // profiles (842x) + 57640: 141, // queries (842x) + 57717: 142, // recent (842x) + 57642: 143, // recover (842x) + 57645: 144, // repeatable (842x) + 57654: 145, // security (842x) + 57656: 146, // serializable (842x) + 57657: 147, // session (842x) + 57658: 148, // share (842x) + 57659: 149, // shared (842x) + 57661: 150, // slave (842x) + 57662: 151, // slow (842x) + 57663: 152, // snapshot (842x) + 57734: 153, // statsBuckets (842x) + 57735: 154, // statsHealthy (842x) + 57733: 155, // statsHistograms (842x) + 57732: 156, // statsMeta (842x) + 57676: 157, // temporary (842x) + 57677: 158, // temptable (842x) + 57678: 159, // textType (842x) + 57679: 160, // than (842x) + 57736: 161, // tidb (842x) + 57723: 162, // top (842x) + 57683: 163, // transaction (842x) + 57684: 164, // triggers (842x) + 57686: 165, // uncommitted (842x) + 57689: 166, // undefined (842x) + 57693: 167, // warnings (842x) + 57697: 168, // addDate (841x) + 57542: 169, // any (841x) + 57543: 170, // ascii (841x) + 57546: 171, // avg (841x) + 57698: 172, // bitAnd (841x) + 57699: 173, // bitOr (841x) + 57700: 174, // bitXor (841x) + 57553: 175, // byteType (841x) + 57701: 176, // cast (841x) + 57559: 177, // coalesce (841x) + 57703: 178, // count (841x) + 57704: 179, // curTime (841x) + 57705: 180, // dateAdd (841x) + 57706: 181, // dateSub (841x) + 57588: 182, // escape (841x) + 57707: 183, // extract (841x) + 57595: 184, // format (841x) + 57708: 185, // getFormat (841x) + 57709: 186, // groupConcat (841x) + 57346: 187, // identifier (841x) + 57713: 188, // max (841x) + 57712: 189, // min (841x) + 57623: 190, // names (841x) + 57715: 191, // now (841x) + 57716: 192, // position (841x) + 57641: 193, // quick (841x) + 57647: 194, // reverse (841x) + 57650: 195, // row (841x) + 57651: 196, // rowCount (841x) + 57672: 197, // some (841x) + 57664: 198, // sqlCache (841x) + 57665: 199, // sqlNoCache (841x) + 57718: 200, // subDate (841x) + 57720: 201, // substring (841x) + 57719: 202, // sum (841x) + 57721: 203, // timestampAdd (841x) + 57722: 204, // timestampDiff (841x) + 57724: 205, // trim (841x) + 40: 206, // '(' (738x) + 57471: 207, // on (719x) + 57348: 208, // stringLit (674x) + 57466: 209, // not (665x) + 57364: 210, // as (632x) + 57448: 211, // left (614x) + 57492: 212, // right (614x) + 57395: 213, // defaultKwd (598x) + 43: 214, // '+' (571x) + 45: 215, // '-' (571x) + 57465: 216, // mod (569x) + 57468: 217, // null (543x) + 57533: 218, // with (540x) + 57515: 219, // union (530x) + 57455: 220, // lock (518x) + 57413: 221, // forKwd (511x) + 57450: 222, // limit (501x) + 57474: 223, // order (493x) + 57531: 224, // where (488x) + 57363: 225, // and (482x) + 57473: 226, // or (482x) + 57354: 227, // andand (481x) + 57631: 228, // pipesAsOr (481x) + 57534: 229, // xor (481x) + 57416: 230, // from (474x) + 57521: 231, // using (474x) + 57772: 232, // eq (463x) + 57502: 233, // straightJoin (457x) + 57496: 234, // set (454x) + 57421: 235, // having (453x) + 57489: 236, // replace (453x) + 57443: 237, // join (450x) + 57420: 238, // group (445x) + 57378: 239, // collate (443x) + 57767: 240, // intLit (441x) + 57383: 241, // cross (439x) + 57431: 242, // inner (439x) + 57537: 243, // natural (439x) + 125: 244, // '}' (438x) + 57449: 245, // like (432x) + 42: 246, // '*' (427x) + 46: 247, // '.' (423x) + 57368: 248, // binaryType (419x) + 57398: 249, // desc (419x) + 57365: 250, // asc (417x) + 57530: 251, // when (416x) + 57390: 252, // dayHour (414x) + 57391: 253, // dayMicrosecond (414x) + 57392: 254, // dayMinute (414x) + 57393: 255, // daySecond (414x) + 57423: 256, // hourMicrosecond (414x) + 57424: 257, // hourMinute (414x) + 57425: 258, // hourSecond (414x) + 57463: 259, // minuteMicrosecond (414x) + 57464: 260, // minuteSecond (414x) + 57494: 261, // secondMicrosecond (414x) + 57535: 262, // yearMonth (414x) + 57406: 263, // elseKwd (413x) + 57428: 264, // in (410x) + 57506: 265, // then (410x) + 60: 266, // '<' (404x) + 62: 267, // '>' (404x) + 57773: 268, // ge (404x) + 57435: 269, // is (404x) + 57774: 270, // le (404x) + 57778: 271, // neq (404x) + 57779: 272, // neqSynonym (404x) + 57780: 273, // nulleq (404x) + 37: 274, // '%' (395x) + 38: 275, // '&' (395x) + 47: 276, // '/' (395x) + 94: 277, // '^' (395x) + 124: 278, // '|' (395x) + 57402: 279, // div (395x) + 57777: 280, // lsh (395x) + 57782: 281, // rsh (395x) + 57387: 282, // currentUser (394x) + 57366: 283, // between (392x) + 57486: 284, // regexpKwd (392x) + 57493: 285, // rlike (392x) + 57426: 286, // ifKwd (391x) + 57436: 287, // insert (391x) + 123: 288, // '{' (390x) + 57349: 289, // singleAtIdentifier (388x) + 57376: 290, // charType (387x) + 57444: 291, // key (385x) + 57525: 292, // values (385x) + 57409: 293, // exists (384x) + 57411: 294, // falseKwd (384x) + 57513: 295, // trueKwd (384x) + 57381: 296, // convert (383x) + 57766: 297, // decLit (383x) + 57765: 298, // floatLit (383x) + 57781: 299, // paramMarker (383x) + 57388: 300, // database (382x) + 57769: 301, // bitLit (381x) + 57754: 302, // builtinNow (381x) + 57386: 303, // currentTs (381x) + 57350: 304, // doubleAtIdentifier (381x) + 57768: 305, // hexLit (381x) + 57453: 306, // localTime (381x) + 57454: 307, // localTs (381x) + 57347: 308, // underscoreCS (381x) + 57433: 309, // interval (380x) + 33: 310, // '!' (379x) + 126: 311, // '~' (379x) + 57740: 312, // builtinAddDate (379x) + 57741: 313, // builtinBitAnd (379x) + 57742: 314, // builtinBitOr (379x) + 57743: 315, // builtinBitXor (379x) + 57744: 316, // builtinCast (379x) + 57745: 317, // builtinCount (379x) + 57746: 318, // builtinCurDate (379x) + 57747: 319, // builtinCurTime (379x) + 57748: 320, // builtinDateAdd (379x) + 57749: 321, // builtinDateSub (379x) + 57750: 322, // builtinExtract (379x) + 57751: 323, // builtinGroupConcat (379x) + 57752: 324, // builtinMax (379x) + 57753: 325, // builtinMin (379x) + 57755: 326, // builtinPosition (379x) + 57757: 327, // builtinSubDate (379x) + 57758: 328, // builtinSubstring (379x) + 57759: 329, // builtinSum (379x) + 57760: 330, // builtinSysDate (379x) + 57761: 331, // builtinTrim (379x) + 57762: 332, // builtinUser (379x) + 57373: 333, // caseKwd (379x) + 57384: 334, // currentDate (379x) + 57385: 335, // currentTime (379x) + 57783: 336, // not2 (379x) + 57488: 337, // repeat (379x) + 57522: 338, // utcDate (379x) + 57524: 339, // utcTime (379x) + 57523: 340, // utcTimestamp (379x) + 57479: 341, // primary (370x) + 57514: 342, // unique (370x) + 57377: 343, // check (367x) + 57485: 344, // references (366x) + 57418: 345, // generated (362x) + 57355: 346, // pipes (359x) + 57427: 347, // ignore (313x) + 57936: 348, // Identifier (312x) + 57989: 349, // NotKeywordToken (312x) + 58111: 350, // TiDBKeyword (312x) + 58121: 351, // UnReservedKeyword (312x) + 57495: 352, // selectKwd (309x) + 57375: 353, // character (285x) + 57477: 354, // partition (254x) + 57476: 355, // packKeys (251x) + 57481: 356, // shardRowIDBits (251x) + 57775: 357, // jss (242x) + 57776: 358, // juss (242x) + 57429: 359, // index (237x) + 57451: 360, // lines (226x) + 57499: 361, // sql (222x) + 57371: 362, // by (221x) + 57414: 363, // force (219x) + 57520: 364, // use (219x) + 57404: 365, // drop (218x) + 57372: 366, // cascade (217x) + 57490: 367, // restrict (217x) + 57510: 368, // to (217x) + 57483: 369, // read (215x) + 57361: 370, // alter (214x) + 57362: 371, // analyze (214x) + 57415: 372, // foreign (213x) + 57417: 373, // fulltext (212x) + 57394: 374, // decimalType (211x) + 57432: 375, // integerType (211x) + 57437: 376, // intType (211x) + 57487: 377, // rename (211x) + 57527: 378, // varcharType (211x) + 64: 379, // '@' (209x) + 57359: 380, // add (209x) + 57367: 381, // bigIntType (209x) + 57369: 382, // blobType (209x) + 57374: 383, // change (209x) + 57403: 384, // doubleType (209x) + 57412: 385, // floatType (209x) + 57438: 386, // int1Type (209x) + 57439: 387, // int2Type (209x) + 57440: 388, // int3Type (209x) + 57441: 389, // int4Type (209x) + 57442: 390, // int8Type (209x) + 57526: 391, // long (209x) + 57456: 392, // longblobType (209x) + 57457: 393, // longtextType (209x) + 57460: 394, // mediumblobType (209x) + 57461: 395, // mediumIntType (209x) + 57462: 396, // mediumtextType (209x) + 57469: 397, // numericType (209x) + 57470: 398, // nvarcharType (209x) + 57484: 399, // realType (209x) + 57498: 400, // smallIntType (209x) + 57507: 401, // tinyblobType (209x) + 57508: 402, // tinyIntType (209x) + 57509: 403, // tinytextType (209x) + 57528: 404, // varbinaryType (209x) + 57532: 405, // write (209x) + 58083: 406, // SubSelect (129x) + 58131: 407, // UserVariable (126x) + 57975: 408, // Literal (125x) + 58071: 409, // SimpleIdent (125x) + 58078: 410, // StringLiteral (125x) + 57918: 411, // FunctionCallGeneric (123x) + 57919: 412, // FunctionCallKeyword (123x) + 57920: 413, // FunctionCallNonKeyword (123x) + 57921: 414, // FunctionNameConflict (123x) + 57922: 415, // FunctionNameDateArith (123x) + 57923: 416, // FunctionNameDateArithMultiForms (123x) + 57924: 417, // FunctionNameDatetimePrecision (123x) + 57925: 418, // FunctionNameOptionalBraces (123x) + 58070: 419, // SimpleExpr (123x) + 58084: 420, // SumExpr (123x) + 58086: 421, // SystemVariable (123x) + 58140: 422, // Variable (123x) + 57819: 423, // BitExpr (113x) + 58028: 424, // PredicateExpr (97x) + 57822: 425, // BoolPri (94x) + 57894: 426, // Expression (94x) + 58156: 427, // logAnd (74x) + 58157: 428, // logOr (74x) + 58095: 429, // TableName (51x) + 57517: 430, // unsigned (44x) + 57536: 431, // zerofill (42x) + 57986: 432, // NUM (41x) + 57835: 433, // ColumnName (35x) + 58079: 434, // StringName (30x) + 57360: 435, // all (29x) + 57886: 436, // EqOpt (24x) + 58050: 437, // SelectStmt (23x) + 58051: 438, // SelectStmtBasic (23x) + 58054: 439, // SelectStmtFromDual (23x) + 58055: 440, // SelectStmtFromTable (23x) + 57901: 441, // FieldLen (21x) + 57503: 442, // tableKwd (21x) + 57967: 443, // LengthNum (18x) + 58124: 444, // UnionSelect (18x) + 58122: 445, // UnionClauseList (17x) + 58125: 446, // UnionStmt (17x) + 57500: 447, // sqlCalcFoundRows (16x) + 57518: 448, // update (16x) + 57828: 449, // CharsetKw (15x) + 57396: 450, // delayed (15x) + 57422: 451, // highPriority (15x) + 57458: 452, // lowPriority (15x) + 58005: 453, // OptFieldLen (14x) + 57397: 454, // deleteKwd (13x) + 57895: 455, // ExpressionList (13x) + 57961: 456, // JoinTable (13x) + 58092: 457, // TableFactor (13x) + 58104: 458, // TableRef (13x) + 58133: 459, // Username (11x) + 57400: 460, // distinct (10x) + 57401: 461, // distinctRow (10x) + 57914: 462, // FromOrIn (10x) + 57434: 463, // into (10x) + 57953: 464, // IndexType (9x) + 57962: 465, // JoinType (9x) + 58013: 466, // OrderBy (9x) + 58014: 467, // OrderByOptional (9x) + 58096: 468, // TableNameList (9x) + 57829: 469, // CharsetName (8x) + 57836: 470, // ColumnNameList (8x) + 57859: 471, // CrossOpt (8x) + 57869: 472, // DefaultKwdOpt (8x) + 57873: 473, // DistinctKwd (8x) + 57942: 474, // IndexColName (8x) + 57963: 475, // KeyOrIndex (8x) + 58004: 476, // OptCollate (8x) + 57831: 477, // ColumnDef (7x) + 57874: 478, // DistinctOpt (7x) + 57408: 479, // escaped (7x) + 57888: 480, // EscapedTableRef (7x) + 57353: 481, // hintEnd (7x) + 57943: 482, // IndexColNameList (7x) + 58057: 483, // SelectStmtLimit (7x) + 58152: 484, // WhereClause (7x) + 58153: 485, // WhereClauseOptional (7x) + 57382: 486, // create (6x) + 57868: 487, // DefaultFalseDistinctOpt (6x) + 57872: 488, // DeleteFromStmt (6x) + 57893: 489, // ExprOrDefault (6x) + 57419: 490, // grant (6x) + 57955: 491, // InsertIntoStmt (6x) + 57983: 492, // MaxNumBuckets (6x) + 58002: 493, // OptBinary (6x) + 58043: 494, // ReplaceIntoStmt (6x) + 58047: 495, // RowFormat (6x) + 58049: 496, // SelectLockOpt (6x) + 57497: 497, // show (6x) + 58063: 498, // ShowDatabaseNameOpt (6x) + 58101: 499, // TableOption (6x) + 58105: 500, // TableRefs (6x) + 57505: 501, // terminated (6x) + 58127: 502, // UpdateStmt (6x) + 57824: 503, // BuggyDefaultFalseDistinctOpt (5x) + 57379: 504, // column (5x) + 57833: 505, // ColumnKeywordOpt (5x) + 57860: 506, // DBName (5x) + 57407: 507, // enclosed (5x) + 57896: 508, // ExpressionListOpt (5x) + 57903: 509, // FieldOpt (5x) + 57904: 510, // FieldOpts (5x) + 57949: 511, // IndexName (5x) + 57951: 512, // IndexOption (5x) + 57952: 513, // IndexOptionList (5x) + 58022: 514, // PartitionDefinitionListOpt (5x) + 58032: 515, // PriorityOpt (5x) + 58065: 516, // ShowLikeOrWhereOpt (5x) + 58112: 517, // TimeUnit (5x) + 58129: 518, // UserSpec (5x) + 57811: 519, // Assignment (4x) + 57815: 520, // AuthString (4x) + 57940: 521, // IgnoreOptional (4x) + 57950: 522, // IndexNameList (4x) + 57954: 523, // IndexTypeOpt (4x) + 57972: 524, // LimitOption (4x) + 57472: 525, // option (4x) + 57475: 526, // outer (4x) + 58024: 527, // PartitionNumOpt (4x) + 58061: 528, // SetExpr (4x) + 58087: 529, // TableAsName (4x) + 58116: 530, // TransactionChar (4x) + 58130: 531, // UserSpecList (4x) + 57771: 532, // assignmentEq (3x) + 57812: 533, // AssignmentList (3x) + 57825: 534, // ByItem (3x) + 57842: 535, // ColumnPosition (3x) + 57848: 536, // Constraint (3x) + 57380: 537, // constraint (3x) + 57850: 538, // ConstraintKeywordOpt (3x) + 57892: 539, // ExplainableStmt (3x) + 57909: 540, // FloatOpt (3x) + 57352: 541, // hintBegin (3x) + 57935: 542, // HintTableList (3x) + 57937: 543, // IfExists (3x) + 57938: 544, // IfNotExists (3x) + 57944: 545, // IndexHint (3x) + 57948: 546, // IndexHintType (3x) + 57430: 547, // infile (3x) + 57445: 548, // keys (3x) + 57979: 549, // LockClause (3x) + 57459: 550, // maxValue (3x) + 58003: 551, // OptCharset (3x) + 58027: 552, // Precision (3x) + 58033: 553, // PrivElem (3x) + 58036: 554, // PrivType (3x) + 58038: 555, // ReferDef (3x) + 58044: 556, // RestrictOrCascadeOpt (3x) + 58048: 557, // RowValue (3x) + 58100: 558, // TableOptimizerHints (3x) + 58102: 559, // TableOptionList (3x) + 58117: 560, // TransactionChars (3x) + 57512: 561, // trigger (3x) + 57519: 562, // usage (3x) + 58135: 563, // ValueSym (3x) + 57801: 564, // AdminStmt (2x) + 57803: 565, // AlterTableOptionListOpt (2x) + 57804: 566, // AlterTableSpec (2x) + 57806: 567, // AlterTableStmt (2x) + 57807: 568, // AlterUserStmt (2x) + 57808: 569, // AnalyzeTableStmt (2x) + 57816: 570, // BeginTransactionStmt (2x) + 57818: 571, // BinlogStmt (2x) + 57826: 572, // ByList (2x) + 57827: 573, // CastType (2x) + 57837: 574, // ColumnNameListOpt (2x) + 57839: 575, // ColumnOption (2x) + 57843: 576, // ColumnSetValue (2x) + 57846: 577, // CommitStmt (2x) + 57851: 578, // CreateDatabaseStmt (2x) + 57852: 579, // CreateIndexStmt (2x) + 57856: 580, // CreateTableStmt (2x) + 57857: 581, // CreateUserStmt (2x) + 57858: 582, // CreateViewStmt (2x) + 57861: 583, // DatabaseOption (2x) + 57389: 584, // databases (2x) + 57864: 585, // DatabaseSym (2x) + 57866: 586, // DeallocateStmt (2x) + 57867: 587, // DeallocateSym (2x) + 57399: 588, // describe (2x) + 57875: 589, // DoStmt (2x) + 57876: 590, // DropDatabaseStmt (2x) + 57877: 591, // DropIndexStmt (2x) + 57878: 592, // DropStatsStmt (2x) + 57879: 593, // DropTableStmt (2x) + 57880: 594, // DropUserStmt (2x) + 57881: 595, // DropViewStmt (2x) + 57884: 596, // EmptyStmt (2x) + 57889: 597, // ExecuteStmt (2x) + 57410: 598, // explain (2x) + 57890: 599, // ExplainStmt (2x) + 57891: 600, // ExplainSym (2x) + 57898: 601, // Field (2x) + 57899: 602, // FieldAsName (2x) + 57900: 603, // FieldAsNameOpt (2x) + 57912: 604, // FlushStmt (2x) + 57913: 605, // FromDual (2x) + 57916: 606, // FuncDatetimePrecList (2x) + 57917: 607, // FuncDatetimePrecListOpt (2x) + 57926: 608, // GeneratedAlways (2x) + 57929: 609, // GrantStmt (2x) + 57931: 610, // HandleRange (2x) + 57933: 611, // HashString (2x) + 57945: 612, // IndexHintList (2x) + 57946: 613, // IndexHintListOpt (2x) + 57956: 614, // InsertValues (2x) + 57958: 615, // IntoOpt (2x) + 57446: 616, // kill (2x) + 57965: 617, // KillOrKillTiDB (2x) + 57966: 618, // KillStmt (2x) + 57971: 619, // LimitClause (2x) + 57452: 620, // load (2x) + 57976: 621, // LoadDataStmt (2x) + 57977: 622, // LoadStatsStmt (2x) + 57981: 623, // LockTablesStmt (2x) + 57984: 624, // MaxValueOrExpression (2x) + 57990: 625, // NowSym (2x) + 57991: 626, // NowSymFunc (2x) + 57992: 627, // NowSymOptionFraction (2x) + 57993: 628, // NumList (2x) + 57994: 629, // NumLiteral (2x) + 57997: 630, // ObjectType (2x) + 57996: 631, // ODBCDateTimeType (2x) + 57356: 632, // odbcDateType (2x) + 57358: 633, // odbcTimestampType (2x) + 57357: 634, // odbcTimeType (2x) + 58008: 635, // OptInteger (2x) + 58010: 636, // OptionalBraces (2x) + 58012: 637, // Order (2x) + 58015: 638, // OuterOpt (2x) + 58016: 639, // PartDefOption (2x) + 58020: 640, // PartitionDefinition (2x) + 58023: 641, // PartitionNameList (2x) + 58026: 642, // PasswordOpt (2x) + 58030: 643, // PreparedStmt (2x) + 58031: 644, // PrimaryOpt (2x) + 58034: 645, // PrivElemList (2x) + 58035: 646, // PrivLevel (2x) + 58039: 647, // ReferOpt (2x) + 58041: 648, // RegexpSym (2x) + 58042: 649, // RenameTableStmt (2x) + 57491: 650, // revoke (2x) + 58045: 651, // RevokeStmt (2x) + 58046: 652, // RollbackStmt (2x) + 58062: 653, // SetStmt (2x) + 58066: 654, // ShowStmt (2x) + 58067: 655, // ShowTableAliasOpt (2x) + 58069: 656, // SignedLiteral (2x) + 58074: 657, // Statement (2x) + 58076: 658, // StatsPersistentVal (2x) + 58077: 659, // StringList (2x) + 58081: 660, // SubPartitionNumOpt (2x) + 58085: 661, // Symbol (2x) + 58089: 662, // TableElement (2x) + 58093: 663, // TableLock (2x) + 58099: 664, // TableOptimizerHintOpt (2x) + 58103: 665, // TableOrTables (2x) + 58109: 666, // TablesTerminalSym (2x) + 58107: 667, // TableToTable (2x) + 58113: 668, // TimestampUnit (2x) + 58114: 669, // TraceStmt (2x) + 58119: 670, // TruncateTableStmt (2x) + 57516: 671, // unlock (2x) + 58126: 672, // UnlockTablesStmt (2x) + 58134: 673, // UsernameList (2x) + 58128: 674, // UseStmt (2x) + 58137: 675, // ValuesList (2x) + 58141: 676, // VariableAssignment (2x) + 58150: 677, // WhenClause (2x) + 57800: 678, // AdminShowSlow (1x) + 57802: 679, // AlterAlgorithm (1x) + 57805: 680, // AlterTableSpecList (1x) + 57809: 681, // AnyOrAll (1x) + 57810: 682, // AsOpt (1x) + 57814: 683, // AuthOption (1x) + 57817: 684, // BetweenOrNotOp (1x) + 57820: 685, // BitValueType (1x) + 57821: 686, // BlobType (1x) + 57823: 687, // BooleanType (1x) + 57370: 688, // both (1x) + 57830: 689, // CharsetOpt (1x) + 57832: 690, // ColumnDefList (1x) + 57834: 691, // ColumnList (1x) + 57838: 692, // ColumnNameListOptWithBrackets (1x) + 57840: 693, // ColumnOptionList (1x) + 57841: 694, // ColumnOptionListOpt (1x) + 57844: 695, // ColumnSetValueList (1x) + 57847: 696, // CompareOp (1x) + 57849: 697, // ConstraintElem (1x) + 57853: 698, // CreateIndexStmtUnique (1x) + 57854: 699, // CreateTableOptionListOpt (1x) + 57855: 700, // CreateTableSelectOpt (1x) + 57862: 701, // DatabaseOptionList (1x) + 57863: 702, // DatabaseOptionListOpt (1x) + 57865: 703, // DateAndTimeType (1x) + 57870: 704, // DefaultTrueDistinctOpt (1x) + 57871: 705, // DefaultValueExpr (1x) + 57405: 706, // dual (1x) + 57882: 707, // DuplicateOpt (1x) + 57883: 708, // ElseOpt (1x) + 57885: 709, // Enclosed (1x) + 57887: 710, // Escaped (1x) + 57897: 711, // ExpressionOpt (1x) + 57902: 712, // FieldList (1x) + 57905: 713, // Fields (1x) + 57906: 714, // FieldsOrColumns (1x) + 57907: 715, // FieldsTerminated (1x) + 57908: 716, // FixedPointType (1x) + 57910: 717, // FloatingPointType (1x) + 57911: 718, // FlushOption (1x) + 57915: 719, // FuncDatetimePrec (1x) + 57927: 720, // GetFormatSelector (1x) + 57928: 721, // GlobalScope (1x) + 57930: 722, // GroupByClause (1x) + 57932: 723, // HandleRangeList (1x) + 57934: 724, // HavingClause (1x) + 57939: 725, // IgnoreLines (1x) + 57947: 726, // IndexHintScope (1x) + 57941: 727, // InOrNotOp (1x) + 57957: 728, // IntegerType (1x) + 57960: 729, // IsolationLevel (1x) + 57959: 730, // IsOrNotOp (1x) + 57964: 731, // KeyOrIndexOpt (1x) + 57447: 732, // leading (1x) + 57968: 733, // LikeEscapeOpt (1x) + 57969: 734, // LikeOrNotOp (1x) + 57970: 735, // LikeTableWithOrWithoutParen (1x) + 57973: 736, // Lines (1x) + 57974: 737, // LinesTerminated (1x) + 57978: 738, // LocalOpt (1x) + 57980: 739, // LockClauseOpt (1x) + 57982: 740, // LockType (1x) + 57985: 741, // MaxValueOrExpressionList (1x) + 57987: 742, // NationalOpt (1x) + 57467: 743, // noWriteToBinLog (1x) + 57988: 744, // NoWriteToBinLogAliasOpt (1x) + 57995: 745, // NumericType (1x) + 57998: 746, // OnDeleteOpt (1x) + 57999: 747, // OnDuplicateKeyUpdate (1x) + 58000: 748, // OnUpdateOpt (1x) + 58001: 749, // OptBinMod (1x) + 58006: 750, // OptFull (1x) + 58007: 751, // OptGConcatSeparator (1x) + 58009: 752, // OptTable (1x) + 58011: 753, // OrReplace (1x) + 58017: 754, // PartDefOptionList (1x) + 58018: 755, // PartDefOptionsOpt (1x) + 58019: 756, // PartDefValuesOpt (1x) + 58021: 757, // PartitionDefinitionList (1x) + 58025: 758, // PartitionOpt (1x) + 57478: 759, // precisionType (1x) + 58029: 760, // PrepareSQL (1x) + 57480: 761, // procedure (1x) + 58037: 762, // QuickOptional (1x) + 57482: 763, // rangeKwd (1x) + 58040: 764, // RegexpOrNotOp (1x) + 58052: 765, // SelectStmtCalcFoundRows (1x) + 58053: 766, // SelectStmtFieldList (1x) + 58056: 767, // SelectStmtGroup (1x) + 58058: 768, // SelectStmtOpts (1x) + 58059: 769, // SelectStmtSQLCache (1x) + 58060: 770, // SelectStmtStraightJoin (1x) + 58064: 771, // ShowIndexKwd (1x) + 58068: 772, // ShowTargetFilterable (1x) + 58072: 773, // Start (1x) + 58073: 774, // Starting (1x) + 57501: 775, // starting (1x) + 58075: 776, // StatementList (1x) + 57504: 777, // stored (1x) + 58080: 778, // StringType (1x) + 58082: 779, // SubPartitionOpt (1x) + 58088: 780, // TableAsNameOpt (1x) + 58090: 781, // TableElementList (1x) + 58091: 782, // TableElementListOpt (1x) + 58094: 783, // TableLockList (1x) + 58097: 784, // TableNameListOpt (1x) + 58098: 785, // TableOptimizerHintList (1x) + 58106: 786, // TableRefsClause (1x) + 58108: 787, // TableToTableList (1x) + 58110: 788, // TextType (1x) + 58115: 789, // TraceableStmt (1x) + 57511: 790, // trailing (1x) + 58118: 791, // TrimDirection (1x) + 58120: 792, // Type (1x) + 58123: 793, // UnionOpt (1x) + 58132: 794, // UserVariableList (1x) + 58136: 795, // Values (1x) + 58138: 796, // ValuesOpt (1x) + 58139: 797, // Varchar (1x) + 58142: 798, // VariableAssignmentList (1x) + 58143: 799, // ViewAlgorithm (1x) + 58144: 800, // ViewCheckOption (1x) + 58145: 801, // ViewDefiner (1x) + 58146: 802, // ViewFieldList (1x) + 58147: 803, // ViewName (1x) + 58148: 804, // ViewSQLSecurity (1x) + 57529: 805, // virtual (1x) + 58149: 806, // VirtualOrStored (1x) + 58151: 807, // WhenClauseList (1x) + 58154: 808, // WithGrantOptionOpt (1x) + 58155: 809, // WithReadLockOpt (1x) + 57799: 810, // $default (0x) + 57770: 811, // andnot (0x) + 57813: 812, // AssignmentListOpt (0x) + 57756: 813, // builtinStddevPop (0x) + 57763: 814, // builtinVarPop (0x) + 57764: 815, // builtinVarSamp (0x) + 57845: 816, // CommaOpt (0x) + 57791: 817, // createTableSelect (0x) + 57784: 818, // empty (0x) + 57345: 819, // error (0x) + 57798: 820, // higherThanComma (0x) + 57789: 821, // insertValues (0x) + 57351: 822, // invalid (0x) + 57797: 823, // lowerThanComma (0x) + 57790: 824, // lowerThanCreateTableSelect (0x) + 57795: 825, // lowerThanEq (0x) + 57788: 826, // lowerThanInsertValues (0x) + 57785: 827, // lowerThanIntervalKeyword (0x) + 57792: 828, // lowerThanKey (0x) + 57794: 829, // lowerThanOn (0x) + 57787: 830, // lowerThanSetKeyword (0x) + 57786: 831, // lowerThanStringLitToken (0x) + 57796: 832, // neg (0x) + 57793: 833, // tableRefPriority (0x) + } + + yySymNames = []string{ + "$end", + "';'", + "comment", + "autoIncrement", + "after", + "first", + "','", + "charsetKwd", + "keyBlockSize", + "engine", + "connection", + "password", + "signed", + "checksum", + "avgRowLength", + "compression", + "delayKeyWrite", + "maxRows", + "minRows", + "rowFormat", + "statsPersistent", + "')'", + "view", + "separator", + "status", + "tables", + "tablespace", + "columns", + "definer", + "fields", + "identified", + "maxExecutionTime", + "tidbHJ", + "tidbINLJ", + "tidbSMJ", + "yearType", + "day", + "hour", + "microsecond", + "minute", + "month", + "quarter", + "second", + "week", + "end", + "privileges", + "algorithm", + "execute", + "offset", + "prepare", + "datetimeType", + "dateType", + "isolation", + "local", + "partitions", + "subpartition", + "timeType", + "user", + "variables", + "event", + "hash", + "jsonType", + "process", + "processlist", + "query", + "reload", + "replication", + "super", + "unknown", + "value", + "admin", + "begin", + "binlog", + "buckets", + "commit", + "compact", + "compressed", + "copyKwd", + "ddl", + "deallocate", + "disable", + "do", + "dynamic", + "enable", + "fixed", + "flush", + "inplace", + "jobs", + "modify", + "no", + "redundant", + "rollback", + "routine", + "start", + "stats", + "subpartitions", + "timestampType", + "trace", + "truncate", + "action", + "always", + "bitType", + "booleanType", + "boolType", + "btree", + "cancel", + "cascaded", + "cleanup", + "client", + "collation", + "committed", + "consistent", + "data", + "duplicate", + "engines", + "enum", + "events", + "exclusive", + "full", + "function", + "global", + "grants", + "identSQLErrors", + "indexes", + "internal", + "invoker", + "job", + "less", + "level", + "master", + "maxConnectionsPerHour", + "maxQueriesPerHour", + "maxUpdatesPerHour", + "maxUserConnections", + "merge", + "mode", + "national", + "none", + "only", + "plugins", + "profiles", + "queries", + "recent", + "recover", + "repeatable", + "security", + "serializable", + "session", + "share", + "shared", + "slave", + "slow", + "snapshot", + "statsBuckets", + "statsHealthy", + "statsHistograms", + "statsMeta", + "temporary", + "temptable", + "textType", + "than", + "tidb", + "top", + "transaction", + "triggers", + "uncommitted", + "undefined", + "warnings", + "addDate", + "any", + "ascii", + "avg", + "bitAnd", + "bitOr", + "bitXor", + "byteType", + "cast", + "coalesce", + "count", + "curTime", + "dateAdd", + "dateSub", + "escape", + "extract", + "format", + "getFormat", + "groupConcat", + "identifier", + "max", + "min", + "names", + "now", + "position", + "quick", + "reverse", + "row", + "rowCount", + "some", + "sqlCache", + "sqlNoCache", + "subDate", + "substring", + "sum", + "timestampAdd", + "timestampDiff", + "trim", + "'('", + "on", + "stringLit", + "not", + "as", + "left", + "right", + "defaultKwd", + "'+'", + "'-'", + "mod", + "null", + "with", + "union", + "lock", + "forKwd", + "limit", + "order", + "where", + "and", + "or", + "andand", + "pipesAsOr", + "xor", + "from", + "using", + "eq", + "straightJoin", + "set", + "having", + "replace", + "join", + "group", + "collate", + "intLit", + "cross", + "inner", + "natural", + "'}'", + "like", + "'*'", + "'.'", + "binaryType", + "desc", + "asc", + "when", + "dayHour", + "dayMicrosecond", + "dayMinute", + "daySecond", + "hourMicrosecond", + "hourMinute", + "hourSecond", + "minuteMicrosecond", + "minuteSecond", + "secondMicrosecond", + "yearMonth", + "elseKwd", + "in", + "then", + "'<'", + "'>'", + "ge", + "is", + "le", + "neq", + "neqSynonym", + "nulleq", + "'%'", + "'&'", + "'/'", + "'^'", + "'|'", + "div", + "lsh", + "rsh", + "currentUser", + "between", + "regexpKwd", + "rlike", + "ifKwd", + "insert", + "'{'", + "singleAtIdentifier", + "charType", + "key", + "values", + "exists", + "falseKwd", + "trueKwd", + "convert", + "decLit", + "floatLit", + "paramMarker", + "database", + "bitLit", + "builtinNow", + "currentTs", + "doubleAtIdentifier", + "hexLit", + "localTime", + "localTs", + "underscoreCS", + "interval", + "'!'", + "'~'", + "builtinAddDate", + "builtinBitAnd", + "builtinBitOr", + "builtinBitXor", + "builtinCast", + "builtinCount", + "builtinCurDate", + "builtinCurTime", + "builtinDateAdd", + "builtinDateSub", + "builtinExtract", + "builtinGroupConcat", + "builtinMax", + "builtinMin", + "builtinPosition", + "builtinSubDate", + "builtinSubstring", + "builtinSum", + "builtinSysDate", + "builtinTrim", + "builtinUser", + "caseKwd", + "currentDate", + "currentTime", + "not2", + "repeat", + "utcDate", + "utcTime", + "utcTimestamp", + "primary", + "unique", + "check", + "references", + "generated", + "pipes", + "ignore", + "Identifier", + "NotKeywordToken", + "TiDBKeyword", + "UnReservedKeyword", + "selectKwd", + "character", + "partition", + "packKeys", + "shardRowIDBits", + "jss", + "juss", + "index", + "lines", + "sql", + "by", + "force", + "use", + "drop", + "cascade", + "restrict", + "to", + "read", + "alter", + "analyze", + "foreign", + "fulltext", + "decimalType", + "integerType", + "intType", + "rename", + "varcharType", + "'@'", + "add", + "bigIntType", + "blobType", + "change", + "doubleType", + "floatType", + "int1Type", + "int2Type", + "int3Type", + "int4Type", + "int8Type", + "long", + "longblobType", + "longtextType", + "mediumblobType", + "mediumIntType", + "mediumtextType", + "numericType", + "nvarcharType", + "realType", + "smallIntType", + "tinyblobType", + "tinyIntType", + "tinytextType", + "varbinaryType", + "write", + "SubSelect", + "UserVariable", + "Literal", + "SimpleIdent", + "StringLiteral", + "FunctionCallGeneric", + "FunctionCallKeyword", + "FunctionCallNonKeyword", + "FunctionNameConflict", + "FunctionNameDateArith", + "FunctionNameDateArithMultiForms", + "FunctionNameDatetimePrecision", + "FunctionNameOptionalBraces", + "SimpleExpr", + "SumExpr", + "SystemVariable", + "Variable", + "BitExpr", + "PredicateExpr", + "BoolPri", + "Expression", + "logAnd", + "logOr", + "TableName", + "unsigned", + "zerofill", + "NUM", + "ColumnName", + "StringName", + "all", + "EqOpt", + "SelectStmt", + "SelectStmtBasic", + "SelectStmtFromDual", + "SelectStmtFromTable", + "FieldLen", + "tableKwd", + "LengthNum", + "UnionSelect", + "UnionClauseList", + "UnionStmt", + "sqlCalcFoundRows", + "update", + "CharsetKw", + "delayed", + "highPriority", + "lowPriority", + "OptFieldLen", + "deleteKwd", + "ExpressionList", + "JoinTable", + "TableFactor", + "TableRef", + "Username", + "distinct", + "distinctRow", + "FromOrIn", + "into", + "IndexType", + "JoinType", + "OrderBy", + "OrderByOptional", + "TableNameList", + "CharsetName", + "ColumnNameList", + "CrossOpt", + "DefaultKwdOpt", + "DistinctKwd", + "IndexColName", + "KeyOrIndex", + "OptCollate", + "ColumnDef", + "DistinctOpt", + "escaped", + "EscapedTableRef", + "hintEnd", + "IndexColNameList", + "SelectStmtLimit", + "WhereClause", + "WhereClauseOptional", + "create", + "DefaultFalseDistinctOpt", + "DeleteFromStmt", + "ExprOrDefault", + "grant", + "InsertIntoStmt", + "MaxNumBuckets", + "OptBinary", + "ReplaceIntoStmt", + "RowFormat", + "SelectLockOpt", + "show", + "ShowDatabaseNameOpt", + "TableOption", + "TableRefs", + "terminated", + "UpdateStmt", + "BuggyDefaultFalseDistinctOpt", + "column", + "ColumnKeywordOpt", + "DBName", + "enclosed", + "ExpressionListOpt", + "FieldOpt", + "FieldOpts", + "IndexName", + "IndexOption", + "IndexOptionList", + "PartitionDefinitionListOpt", + "PriorityOpt", + "ShowLikeOrWhereOpt", + "TimeUnit", + "UserSpec", + "Assignment", + "AuthString", + "IgnoreOptional", + "IndexNameList", + "IndexTypeOpt", + "LimitOption", + "option", + "outer", + "PartitionNumOpt", + "SetExpr", + "TableAsName", + "TransactionChar", + "UserSpecList", + "assignmentEq", + "AssignmentList", + "ByItem", + "ColumnPosition", + "Constraint", + "constraint", + "ConstraintKeywordOpt", + "ExplainableStmt", + "FloatOpt", + "hintBegin", + "HintTableList", + "IfExists", + "IfNotExists", + "IndexHint", + "IndexHintType", + "infile", + "keys", + "LockClause", + "maxValue", + "OptCharset", + "Precision", + "PrivElem", + "PrivType", + "ReferDef", + "RestrictOrCascadeOpt", + "RowValue", + "TableOptimizerHints", + "TableOptionList", + "TransactionChars", + "trigger", + "usage", + "ValueSym", + "AdminStmt", + "AlterTableOptionListOpt", + "AlterTableSpec", + "AlterTableStmt", + "AlterUserStmt", + "AnalyzeTableStmt", + "BeginTransactionStmt", + "BinlogStmt", + "ByList", + "CastType", + "ColumnNameListOpt", + "ColumnOption", + "ColumnSetValue", + "CommitStmt", + "CreateDatabaseStmt", + "CreateIndexStmt", + "CreateTableStmt", + "CreateUserStmt", + "CreateViewStmt", + "DatabaseOption", + "databases", + "DatabaseSym", + "DeallocateStmt", + "DeallocateSym", + "describe", + "DoStmt", + "DropDatabaseStmt", + "DropIndexStmt", + "DropStatsStmt", + "DropTableStmt", + "DropUserStmt", + "DropViewStmt", + "EmptyStmt", + "ExecuteStmt", + "explain", + "ExplainStmt", + "ExplainSym", + "Field", + "FieldAsName", + "FieldAsNameOpt", + "FlushStmt", + "FromDual", + "FuncDatetimePrecList", + "FuncDatetimePrecListOpt", + "GeneratedAlways", + "GrantStmt", + "HandleRange", + "HashString", + "IndexHintList", + "IndexHintListOpt", + "InsertValues", + "IntoOpt", + "kill", + "KillOrKillTiDB", + "KillStmt", + "LimitClause", + "load", + "LoadDataStmt", + "LoadStatsStmt", + "LockTablesStmt", + "MaxValueOrExpression", + "NowSym", + "NowSymFunc", + "NowSymOptionFraction", + "NumList", + "NumLiteral", + "ObjectType", + "ODBCDateTimeType", + "odbcDateType", + "odbcTimestampType", + "odbcTimeType", + "OptInteger", + "OptionalBraces", + "Order", + "OuterOpt", + "PartDefOption", + "PartitionDefinition", + "PartitionNameList", + "PasswordOpt", + "PreparedStmt", + "PrimaryOpt", + "PrivElemList", + "PrivLevel", + "ReferOpt", + "RegexpSym", + "RenameTableStmt", + "revoke", + "RevokeStmt", + "RollbackStmt", + "SetStmt", + "ShowStmt", + "ShowTableAliasOpt", + "SignedLiteral", + "Statement", + "StatsPersistentVal", + "StringList", + "SubPartitionNumOpt", + "Symbol", + "TableElement", + "TableLock", + "TableOptimizerHintOpt", + "TableOrTables", + "TablesTerminalSym", + "TableToTable", + "TimestampUnit", + "TraceStmt", + "TruncateTableStmt", + "unlock", + "UnlockTablesStmt", + "UsernameList", + "UseStmt", + "ValuesList", + "VariableAssignment", + "WhenClause", + "AdminShowSlow", + "AlterAlgorithm", + "AlterTableSpecList", + "AnyOrAll", + "AsOpt", + "AuthOption", + "BetweenOrNotOp", + "BitValueType", + "BlobType", + "BooleanType", + "both", + "CharsetOpt", + "ColumnDefList", + "ColumnList", + "ColumnNameListOptWithBrackets", + "ColumnOptionList", + "ColumnOptionListOpt", + "ColumnSetValueList", + "CompareOp", + "ConstraintElem", + "CreateIndexStmtUnique", + "CreateTableOptionListOpt", + "CreateTableSelectOpt", + "DatabaseOptionList", + "DatabaseOptionListOpt", + "DateAndTimeType", + "DefaultTrueDistinctOpt", + "DefaultValueExpr", + "dual", + "DuplicateOpt", + "ElseOpt", + "Enclosed", + "Escaped", + "ExpressionOpt", + "FieldList", + "Fields", + "FieldsOrColumns", + "FieldsTerminated", + "FixedPointType", + "FloatingPointType", + "FlushOption", + "FuncDatetimePrec", + "GetFormatSelector", + "GlobalScope", + "GroupByClause", + "HandleRangeList", + "HavingClause", + "IgnoreLines", + "IndexHintScope", + "InOrNotOp", + "IntegerType", + "IsolationLevel", + "IsOrNotOp", + "KeyOrIndexOpt", + "leading", + "LikeEscapeOpt", + "LikeOrNotOp", + "LikeTableWithOrWithoutParen", + "Lines", + "LinesTerminated", + "LocalOpt", + "LockClauseOpt", + "LockType", + "MaxValueOrExpressionList", + "NationalOpt", + "noWriteToBinLog", + "NoWriteToBinLogAliasOpt", + "NumericType", + "OnDeleteOpt", + "OnDuplicateKeyUpdate", + "OnUpdateOpt", + "OptBinMod", + "OptFull", + "OptGConcatSeparator", + "OptTable", + "OrReplace", + "PartDefOptionList", + "PartDefOptionsOpt", + "PartDefValuesOpt", + "PartitionDefinitionList", + "PartitionOpt", + "precisionType", + "PrepareSQL", + "procedure", + "QuickOptional", + "rangeKwd", + "RegexpOrNotOp", + "SelectStmtCalcFoundRows", + "SelectStmtFieldList", + "SelectStmtGroup", + "SelectStmtOpts", + "SelectStmtSQLCache", + "SelectStmtStraightJoin", + "ShowIndexKwd", + "ShowTargetFilterable", + "Start", + "Starting", + "starting", + "StatementList", + "stored", + "StringType", + "SubPartitionOpt", + "TableAsNameOpt", + "TableElementList", + "TableElementListOpt", + "TableLockList", + "TableNameListOpt", + "TableOptimizerHintList", + "TableRefsClause", + "TableToTableList", + "TextType", + "TraceableStmt", + "trailing", + "TrimDirection", + "Type", + "UnionOpt", + "UserVariableList", + "Values", + "ValuesOpt", + "Varchar", + "VariableAssignmentList", + "ViewAlgorithm", + "ViewCheckOption", + "ViewDefiner", + "ViewFieldList", + "ViewName", + "ViewSQLSecurity", + "virtual", + "VirtualOrStored", + "WhenClauseList", + "WithGrantOptionOpt", + "WithReadLockOpt", + "$default", + "andnot", + "AssignmentListOpt", + "builtinStddevPop", + "builtinVarPop", + "builtinVarSamp", + "CommaOpt", + "createTableSelect", + "empty", + "error", + "higherThanComma", + "insertValues", + "invalid", + "lowerThanComma", + "lowerThanCreateTableSelect", + "lowerThanEq", + "lowerThanInsertValues", + "lowerThanIntervalKeyword", + "lowerThanKey", + "lowerThanOn", + "lowerThanSetKeyword", + "lowerThanStringLitToken", + "neg", + "tableRefPriority", + } + + yyReductions = []struct{ xsym, components int }{ + {0, 1}, + {773, 1}, + {567, 5}, + {567, 8}, + {567, 10}, + {566, 1}, + {566, 5}, + {566, 4}, + {566, 5}, + {566, 2}, + {566, 3}, + {566, 4}, + {566, 3}, + {566, 3}, + {566, 3}, + {566, 4}, + {566, 2}, + {566, 2}, + {566, 4}, + {566, 5}, + {566, 6}, + {566, 5}, + {566, 3}, + {566, 2}, + {566, 3}, + {566, 5}, + {566, 1}, + {566, 3}, + {566, 1}, + {679, 1}, + {679, 1}, + {679, 1}, + {739, 0}, + {739, 1}, + {549, 3}, + {549, 3}, + {549, 3}, + {549, 3}, + {475, 1}, + {475, 1}, + {731, 0}, + {731, 1}, + {505, 0}, + {505, 1}, + {535, 0}, + {535, 1}, + {535, 2}, + {680, 1}, + {680, 3}, + {641, 1}, + {641, 3}, + {538, 0}, + {538, 1}, + {538, 2}, + {661, 1}, + {649, 3}, + {787, 1}, + {787, 3}, + {667, 3}, + {569, 4}, + {569, 6}, + {569, 6}, + {569, 8}, + {492, 0}, + {492, 3}, + {519, 3}, + {533, 1}, + {533, 3}, + {812, 0}, + {812, 1}, + {570, 1}, + {570, 2}, + {570, 5}, + {571, 2}, + {690, 1}, + {690, 3}, + {477, 3}, + {433, 1}, + {433, 3}, + {433, 5}, + {470, 1}, + {470, 3}, + {574, 0}, + {574, 1}, + {692, 0}, + {692, 3}, + {577, 1}, + {644, 0}, + {644, 1}, + {575, 2}, + {575, 1}, + {575, 1}, + {575, 2}, + {575, 1}, + {575, 2}, + {575, 2}, + {575, 3}, + {575, 2}, + {575, 4}, + {575, 6}, + {575, 1}, + {608, 0}, + {608, 2}, + {806, 0}, + {806, 1}, + {806, 1}, + {693, 1}, + {693, 2}, + {694, 0}, + {694, 1}, + {697, 8}, + {697, 7}, + {697, 7}, + {697, 8}, + {697, 7}, + {555, 7}, + {746, 0}, + {746, 3}, + {748, 0}, + {748, 3}, + {647, 1}, + {647, 1}, + {647, 2}, + {647, 2}, + {705, 1}, + {705, 1}, + {627, 1}, + {627, 3}, + {627, 4}, + {626, 1}, + {626, 1}, + {626, 1}, + {626, 1}, + {625, 1}, + {625, 1}, + {625, 1}, + {656, 1}, + {656, 2}, + {656, 2}, + {629, 1}, + {629, 1}, + {629, 1}, + {579, 12}, + {698, 0}, + {698, 1}, + {474, 3}, + {482, 1}, + {482, 3}, + {578, 5}, + {506, 1}, + {583, 4}, + {583, 4}, + {702, 0}, + {702, 1}, + {701, 1}, + {701, 2}, + {580, 10}, + {580, 5}, + {472, 0}, + {472, 1}, + {758, 0}, + {758, 8}, + {758, 8}, + {758, 9}, + {758, 9}, + {779, 0}, + {779, 7}, + {779, 7}, + {660, 0}, + {660, 2}, + {527, 0}, + {527, 2}, + {514, 0}, + {514, 3}, + {757, 1}, + {757, 3}, + {640, 4}, + {755, 0}, + {755, 1}, + {754, 1}, + {754, 2}, + {639, 3}, + {639, 3}, + {639, 3}, + {756, 0}, + {756, 4}, + {756, 6}, + {707, 0}, + {707, 1}, + {707, 1}, + {682, 0}, + {682, 1}, + {700, 0}, + {700, 1}, + {700, 1}, + {700, 1}, + {735, 2}, + {735, 4}, + {582, 11}, + {753, 0}, + {753, 2}, + {799, 0}, + {799, 3}, + {799, 3}, + {799, 3}, + {801, 0}, + {801, 3}, + {804, 0}, + {804, 3}, + {804, 3}, + {803, 1}, + {802, 0}, + {802, 3}, + {691, 1}, + {691, 3}, + {800, 0}, + {800, 4}, + {800, 4}, + {589, 2}, + {488, 11}, + {488, 9}, + {488, 10}, + {585, 1}, + {590, 4}, + {591, 6}, + {593, 4}, + {593, 6}, + {595, 5}, + {594, 3}, + {594, 5}, + {592, 3}, + {556, 0}, + {556, 1}, + {556, 1}, + {665, 1}, + {665, 1}, + {436, 0}, + {436, 1}, + {596, 0}, + {669, 2}, + {600, 1}, + {600, 1}, + {600, 1}, + {599, 2}, + {599, 3}, + {599, 2}, + {599, 5}, + {599, 3}, + {443, 1}, + {432, 1}, + {426, 3}, + {426, 3}, + {426, 3}, + {426, 3}, + {426, 2}, + {426, 3}, + {426, 3}, + {426, 3}, + {426, 1}, + {624, 1}, + {624, 1}, + {428, 1}, + {428, 1}, + {427, 1}, + {427, 1}, + {455, 1}, + {455, 3}, + {741, 1}, + {741, 3}, + {508, 0}, + {508, 1}, + {607, 0}, + {607, 1}, + {606, 1}, + {425, 3}, + {425, 3}, + {425, 4}, + {425, 5}, + {425, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {696, 1}, + {684, 1}, + {684, 2}, + {730, 1}, + {730, 2}, + {727, 1}, + {727, 2}, + {734, 1}, + {734, 2}, + {764, 1}, + {764, 2}, + {681, 1}, + {681, 1}, + {681, 1}, + {424, 5}, + {424, 3}, + {424, 5}, + {424, 4}, + {424, 3}, + {424, 1}, + {648, 1}, + {648, 1}, + {733, 0}, + {733, 2}, + {601, 1}, + {601, 3}, + {601, 5}, + {601, 2}, + {601, 5}, + {603, 0}, + {603, 1}, + {602, 1}, + {602, 2}, + {602, 1}, + {602, 2}, + {712, 1}, + {712, 3}, + {722, 3}, + {724, 0}, + {724, 2}, + {543, 0}, + {543, 2}, + {544, 0}, + {544, 3}, + {521, 0}, + {521, 1}, + {511, 0}, + {511, 1}, + {513, 0}, + {513, 2}, + {512, 3}, + {512, 1}, + {512, 2}, + {464, 2}, + {464, 2}, + {523, 0}, + {523, 1}, + {348, 1}, + {348, 1}, + {348, 1}, + {348, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {351, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {350, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {349, 1}, + {491, 7}, + {615, 0}, + {615, 1}, + {614, 5}, + {614, 4}, + {614, 6}, + {614, 4}, + {614, 2}, + {614, 3}, + {614, 1}, + {614, 1}, + {614, 2}, + {563, 1}, + {563, 1}, + {675, 1}, + {675, 3}, + {557, 3}, + {796, 0}, + {796, 1}, + {795, 3}, + {795, 1}, + {489, 1}, + {489, 1}, + {576, 3}, + {695, 0}, + {695, 1}, + {695, 3}, + {747, 0}, + {747, 5}, + {494, 5}, + {631, 1}, + {631, 1}, + {631, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 1}, + {408, 2}, + {408, 1}, + {408, 1}, + {410, 1}, + {410, 2}, + {466, 3}, + {572, 1}, + {572, 3}, + {534, 2}, + {637, 0}, + {637, 1}, + {637, 1}, + {467, 0}, + {467, 1}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 5}, + {423, 5}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 3}, + {423, 1}, + {409, 1}, + {409, 3}, + {409, 4}, + {409, 5}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 3}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 1}, + {419, 2}, + {419, 2}, + {419, 2}, + {419, 2}, + {419, 3}, + {419, 2}, + {419, 1}, + {419, 3}, + {419, 5}, + {419, 6}, + {419, 2}, + {419, 2}, + {419, 6}, + {419, 5}, + {419, 6}, + {419, 6}, + {419, 4}, + {419, 4}, + {419, 3}, + {419, 3}, + {473, 1}, + {473, 1}, + {478, 1}, + {478, 1}, + {487, 0}, + {487, 1}, + {704, 0}, + {704, 1}, + {503, 1}, + {503, 2}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {414, 1}, + {636, 0}, + {636, 2}, + {418, 1}, + {418, 1}, + {418, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {417, 1}, + {412, 4}, + {412, 4}, + {412, 2}, + {412, 3}, + {412, 2}, + {412, 4}, + {412, 6}, + {412, 2}, + {412, 2}, + {412, 2}, + {412, 4}, + {412, 6}, + {412, 4}, + {412, 4}, + {413, 4}, + {413, 4}, + {413, 6}, + {413, 8}, + {413, 8}, + {413, 6}, + {413, 6}, + {413, 6}, + {413, 6}, + {413, 6}, + {413, 8}, + {413, 8}, + {413, 8}, + {413, 8}, + {413, 4}, + {413, 6}, + {413, 6}, + {413, 7}, + {720, 1}, + {720, 1}, + {720, 1}, + {720, 1}, + {415, 1}, + {415, 1}, + {416, 1}, + {416, 1}, + {791, 1}, + {791, 1}, + {791, 1}, + {420, 5}, + {420, 4}, + {420, 5}, + {420, 4}, + {420, 5}, + {420, 4}, + {420, 5}, + {420, 5}, + {420, 5}, + {420, 4}, + {420, 4}, + {420, 7}, + {420, 5}, + {420, 5}, + {420, 5}, + {751, 0}, + {751, 2}, + {411, 4}, + {719, 0}, + {719, 2}, + {719, 3}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {517, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {668, 1}, + {711, 0}, + {711, 1}, + {807, 1}, + {807, 2}, + {677, 4}, + {708, 0}, + {708, 2}, + {573, 2}, + {573, 3}, + {573, 1}, + {573, 2}, + {573, 2}, + {573, 2}, + {573, 2}, + {573, 2}, + {573, 1}, + {515, 0}, + {515, 1}, + {515, 1}, + {515, 1}, + {429, 1}, + {429, 3}, + {468, 1}, + {468, 3}, + {762, 0}, + {762, 1}, + {643, 4}, + {760, 1}, + {760, 1}, + {597, 2}, + {597, 4}, + {794, 1}, + {794, 3}, + {586, 3}, + {587, 1}, + {587, 1}, + {652, 1}, + {438, 3}, + {439, 4}, + {440, 6}, + {437, 4}, + {437, 3}, + {437, 4}, + {605, 2}, + {786, 1}, + {500, 1}, + {500, 3}, + {480, 1}, + {480, 4}, + {458, 1}, + {458, 1}, + {457, 3}, + {457, 4}, + {457, 4}, + {457, 3}, + {780, 0}, + {780, 1}, + {529, 1}, + {529, 2}, + {546, 2}, + {546, 2}, + {546, 2}, + {726, 0}, + {726, 2}, + {726, 3}, + {726, 3}, + {545, 5}, + {522, 0}, + {522, 1}, + {522, 3}, + {612, 1}, + {612, 2}, + {613, 0}, + {613, 1}, + {456, 3}, + {456, 5}, + {456, 7}, + {456, 7}, + {456, 9}, + {456, 4}, + {456, 6}, + {456, 3}, + {456, 5}, + {465, 1}, + {465, 1}, + {638, 0}, + {638, 1}, + {471, 1}, + {471, 2}, + {471, 2}, + {619, 0}, + {619, 2}, + {524, 1}, + {524, 1}, + {483, 0}, + {483, 2}, + {483, 4}, + {483, 4}, + {768, 6}, + {558, 0}, + {558, 3}, + {542, 1}, + {542, 3}, + {785, 1}, + {785, 2}, + {664, 4}, + {664, 4}, + {664, 4}, + {664, 4}, + {765, 0}, + {765, 1}, + {769, 0}, + {769, 1}, + {769, 1}, + {770, 0}, + {770, 1}, + {766, 1}, + {767, 0}, + {767, 1}, + {406, 3}, + {406, 3}, + {496, 0}, + {496, 2}, + {496, 4}, + {446, 7}, + {446, 6}, + {446, 7}, + {446, 8}, + {445, 1}, + {445, 4}, + {444, 1}, + {444, 3}, + {793, 1}, + {653, 2}, + {653, 4}, + {653, 6}, + {653, 4}, + {653, 4}, + {653, 3}, + {560, 1}, + {560, 3}, + {530, 3}, + {530, 2}, + {530, 2}, + {729, 2}, + {729, 2}, + {729, 2}, + {729, 1}, + {528, 1}, + {528, 1}, + {676, 3}, + {676, 4}, + {676, 4}, + {676, 4}, + {676, 3}, + {676, 3}, + {676, 3}, + {676, 2}, + {676, 4}, + {676, 4}, + {676, 2}, + {469, 1}, + {469, 1}, + {798, 0}, + {798, 1}, + {798, 3}, + {422, 1}, + {422, 1}, + {421, 1}, + {407, 1}, + {459, 1}, + {459, 3}, + {459, 2}, + {459, 2}, + {673, 1}, + {673, 3}, + {642, 1}, + {642, 4}, + {520, 1}, + {564, 3}, + {564, 4}, + {564, 5}, + {564, 4}, + {564, 5}, + {564, 5}, + {564, 5}, + {564, 6}, + {564, 4}, + {564, 5}, + {564, 6}, + {564, 4}, + {678, 2}, + {678, 2}, + {678, 3}, + {678, 3}, + {723, 1}, + {723, 3}, + {610, 5}, + {628, 1}, + {628, 3}, + {654, 3}, + {654, 4}, + {654, 4}, + {654, 2}, + {654, 4}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 3}, + {654, 2}, + {654, 2}, + {771, 1}, + {771, 1}, + {771, 1}, + {462, 1}, + {462, 1}, + {772, 1}, + {772, 1}, + {772, 1}, + {772, 3}, + {772, 3}, + {772, 3}, + {772, 5}, + {772, 4}, + {772, 4}, + {772, 1}, + {772, 1}, + {772, 2}, + {772, 2}, + {772, 1}, + {772, 2}, + {772, 2}, + {772, 2}, + {772, 2}, + {772, 1}, + {516, 0}, + {516, 2}, + {516, 2}, + {721, 0}, + {721, 1}, + {721, 1}, + {750, 0}, + {750, 1}, + {498, 0}, + {498, 2}, + {655, 2}, + {604, 3}, + {718, 1}, + {718, 1}, + {718, 3}, + {744, 0}, + {744, 1}, + {744, 1}, + {784, 0}, + {784, 1}, + {809, 0}, + {809, 3}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {657, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {789, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {539, 1}, + {776, 1}, + {776, 3}, + {536, 2}, + {662, 1}, + {662, 1}, + {662, 4}, + {781, 1}, + {781, 3}, + {782, 0}, + {782, 3}, + {499, 2}, + {499, 3}, + {499, 4}, + {499, 4}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 3}, + {499, 1}, + {499, 3}, + {499, 3}, + {499, 3}, + {658, 1}, + {658, 1}, + {565, 0}, + {565, 1}, + {699, 0}, + {699, 1}, + {559, 1}, + {559, 2}, + {559, 3}, + {752, 0}, + {752, 1}, + {670, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {495, 3}, + {792, 1}, + {792, 1}, + {792, 1}, + {745, 3}, + {745, 2}, + {745, 3}, + {745, 3}, + {745, 2}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {728, 1}, + {687, 1}, + {687, 1}, + {635, 0}, + {635, 1}, + {635, 1}, + {716, 1}, + {716, 1}, + {717, 1}, + {717, 1}, + {717, 1}, + {717, 2}, + {685, 1}, + {778, 5}, + {778, 4}, + {778, 5}, + {778, 4}, + {778, 2}, + {778, 2}, + {778, 1}, + {778, 3}, + {778, 6}, + {778, 6}, + {778, 1}, + {742, 0}, + {742, 1}, + {797, 2}, + {797, 1}, + {797, 1}, + {686, 1}, + {686, 2}, + {686, 1}, + {686, 1}, + {788, 1}, + {788, 2}, + {788, 1}, + {788, 1}, + {788, 2}, + {703, 1}, + {703, 2}, + {703, 2}, + {703, 2}, + {703, 3}, + {441, 3}, + {453, 0}, + {453, 1}, + {509, 1}, + {509, 1}, + {509, 1}, + {510, 0}, + {510, 2}, + {540, 0}, + {540, 1}, + {540, 1}, + {552, 5}, + {749, 0}, + {749, 1}, + {493, 0}, + {493, 2}, + {493, 3}, + {551, 0}, + {551, 2}, + {449, 2}, + {449, 1}, + {476, 0}, + {476, 2}, + {659, 1}, + {659, 3}, + {434, 1}, + {434, 1}, + {502, 10}, + {502, 8}, + {674, 2}, + {484, 2}, + {485, 0}, + {485, 1}, + {816, 0}, + {816, 1}, + {581, 4}, + {568, 4}, + {568, 9}, + {518, 2}, + {531, 1}, + {531, 3}, + {683, 0}, + {683, 3}, + {683, 3}, + {683, 5}, + {683, 5}, + {683, 4}, + {611, 1}, + {609, 8}, + {808, 0}, + {808, 3}, + {808, 3}, + {808, 3}, + {808, 3}, + {808, 3}, + {553, 1}, + {553, 4}, + {645, 1}, + {645, 3}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 2}, + {554, 1}, + {554, 2}, + {554, 2}, + {554, 1}, + {554, 1}, + {554, 3}, + {554, 2}, + {554, 2}, + {554, 2}, + {554, 2}, + {554, 2}, + {554, 1}, + {630, 0}, + {630, 1}, + {646, 1}, + {646, 3}, + {646, 3}, + {646, 3}, + {646, 1}, + {651, 7}, + {621, 13}, + {725, 0}, + {725, 3}, + {689, 0}, + {689, 3}, + {738, 0}, + {738, 1}, + {713, 0}, + {713, 4}, + {714, 1}, + {714, 1}, + {715, 0}, + {715, 3}, + {709, 0}, + {709, 3}, + {710, 0}, + {710, 3}, + {736, 0}, + {736, 3}, + {774, 0}, + {774, 3}, + {737, 0}, + {737, 3}, + {672, 2}, + {623, 3}, + {666, 1}, + {666, 1}, + {663, 2}, + {740, 1}, + {740, 2}, + {740, 1}, + {783, 1}, + {783, 3}, + {618, 2}, + {618, 3}, + {618, 3}, + {617, 1}, + {617, 2}, + {622, 3}, + } + + yyXErrors = map[yyXError]string{} + + yyParseTab = [2289][]uint16{ + // 0 + {1115, 1115, 47: 1375, 49: 1374, 70: 1388, 1359, 1361, 74: 1362, 79: 1377, 81: 1364, 85: 1390, 91: 1378, 93: 1360, 97: 1367, 1437, 206: 1383, 220: 1444, 234: 1387, 236: 1373, 249: 1370, 287: 1372, 352: 1379, 364: 1439, 1366, 370: 1356, 1358, 377: 1357, 406: 1429, 437: 1386, 1380, 1381, 1382, 444: 1385, 1384, 1426, 448: 1438, 454: 1365, 486: 1363, 488: 1400, 490: 1440, 1417, 494: 1424, 497: 1389, 502: 1432, 564: 1392, 567: 1393, 1394, 1395, 1396, 1397, 577: 1398, 1403, 1404, 1405, 1407, 1406, 586: 1399, 1376, 1369, 1408, 1409, 1410, 1414, 1411, 1413, 1412, 1391, 1401, 1368, 1402, 1371, 604: 1415, 609: 1416, 616: 1446, 1445, 1418, 620: 1442, 1419, 1420, 1435, 643: 1421, 649: 1423, 1441, 1425, 1422, 1427, 1428, 657: 1436, 669: 1430, 1431, 1443, 1434, 674: 1433, 773: 1354, 776: 1355}, + {1353}, + {1352, 3640}, + {57: 3542, 347: 1843, 442: 1023, 521: 3541}, + {442: 3533}, + // 5 + {442: 3514}, + {1283, 1283}, + {163: 3510}, + {208: 3509}, + {1267, 1267}, + // 10 + {22: 1154, 28: 1154, 46: 1154, 57: 3013, 226: 3012, 300: 2953, 342: 3008, 359: 1210, 361: 1154, 442: 3010, 585: 3009, 698: 3007, 753: 3011}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 3006}, + {2: 461, 461, 461, 461, 7: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 22: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 230: 461, 347: 461, 450: 461, 461, 461, 541: 1837, 558: 2987}, + {22: 2957, 25: 2558, 49: 525, 57: 2958, 94: 2959, 300: 2953, 359: 2955, 442: 2557, 585: 2954, 665: 2956}, + {206: 2313, 236: 1373, 287: 1372, 352: 1379, 437: 2947, 1380, 1381, 1382, 444: 1385, 1384, 2952, 448: 1438, 454: 1365, 488: 2948, 491: 2950, 494: 2951, 502: 2949, 789: 2946}, + // 15 + {2: 1113, 1113, 1113, 1113, 7: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 22: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 236: 1113, 287: 1113, 352: 1113, 371: 1113, 448: 1113, 454: 1113}, + {2: 1112, 1112, 1112, 1112, 7: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 22: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 236: 1112, 287: 1112, 352: 1112, 371: 1112, 448: 1112, 454: 1112}, + {2: 1111, 1111, 1111, 1111, 7: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 22: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 236: 1111, 287: 1111, 352: 1111, 371: 1111, 448: 1111, 454: 1111}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 2933, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 2313, 236: 1373, 287: 1372, 348: 1662, 1459, 1460, 1458, 1379, 371: 2934, 429: 2931, 437: 2935, 1380, 1381, 1382, 444: 1385, 1384, 2940, 448: 1438, 454: 1365, 488: 2936, 491: 2938, 494: 2939, 502: 2937, 539: 2932}, + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 347: 544, 450: 1841, 1840, 1839, 463: 544, 515: 2920}, + // 20 + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 450: 1841, 1840, 1839, 463: 544, 515: 2879}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2874, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2868, 1459, 1460, 1458}, + {49: 2866}, + {49: 526}, + // 25 + {524, 524}, + {2: 461, 461, 461, 461, 7: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 22: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 208: 461, 461, 211: 461, 461, 461, 461, 461, 461, 461, 233: 461, 236: 461, 240: 461, 246: 461, 461, 461, 282: 461, 286: 461, 461, 461, 461, 461, 292: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 435: 461, 447: 461, 450: 461, 461, 461, 460: 461, 461, 541: 1837, 558: 2831, 768: 2830}, + {753, 753, 21: 753, 207: 753, 218: 753, 753, 753, 753, 753, 2033, 230: 2804, 466: 2034, 2827, 605: 2803}, + {466, 466, 21: 466, 207: 466, 218: 466, 466, 466, 466, 2785, 483: 2825}, + {753, 753, 21: 753, 207: 753, 218: 753, 753, 753, 753, 753, 2033, 466: 2034, 2822}, + // 30 + {206: 2313, 352: 1379, 437: 2321, 1380, 1381, 1382, 444: 1385, 1384, 2312}, + {219: 2771}, + {219: 432}, + {266, 266, 219: 430}, + {397, 397, 1540, 1463, 1464, 1496, 397, 2697, 1545, 1489, 1542, 2701, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 2699, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 2698, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 2702, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 2703, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 2700, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 289: 2707, 304: 2706, 348: 2705, 1459, 1460, 1458, 353: 2275, 449: 2708, 676: 2709, 798: 2704}, + // 35 + {13: 2651, 105: 2652, 107: 2650, 143: 2649, 343: 2648, 497: 2647}, + {7: 2276, 24: 320, 317, 27: 317, 29: 317, 45: 2582, 58: 320, 63: 317, 109: 2594, 114: 2586, 116: 2598, 118: 2602, 2597, 2600, 2574, 2592, 2584, 129: 2575, 139: 2599, 2581, 147: 2601, 153: 2579, 2580, 2578, 2577, 164: 2595, 167: 2591, 353: 2275, 359: 2583, 442: 2589, 449: 2588, 486: 2573, 548: 2585, 584: 2587, 721: 2593, 750: 2576, 761: 2596, 771: 2590, 2572}, + {24: 308, 308, 45: 308, 53: 2556, 442: 308, 743: 2555, 2554}, + {301, 301}, + {300, 300}, + // 40 + {299, 299}, + {298, 298}, + {297, 297}, + {296, 296}, + {295, 295}, + // 45 + {294, 294}, + {293, 293}, + {292, 292}, + {291, 291}, + {290, 290}, + // 50 + {289, 289}, + {288, 288}, + {287, 287}, + {286, 286}, + {285, 285}, + // 55 + {284, 284}, + {283, 283}, + {282, 282}, + {281, 281}, + {280, 280}, + // 60 + {279, 279}, + {278, 278}, + {277, 277}, + {276, 276}, + {275, 275}, + // 65 + {274, 274}, + {273, 273}, + {272, 272}, + {271, 271}, + {270, 270}, + // 70 + {269, 269}, + {268, 268}, + {267, 267}, + {265, 265}, + {264, 264}, + // 75 + {263, 263}, + {262, 262}, + {261, 261}, + {260, 260}, + {259, 259}, + // 80 + {258, 258}, + {257, 257}, + {256, 256}, + {243, 243}, + {2: 205, 205, 205, 205, 7: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 22: 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 442: 2551, 752: 2552}, + // 85 + {2: 461, 461, 461, 461, 7: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 22: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 288: 461, 347: 461, 450: 461, 461, 461, 541: 1837, 558: 1838}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 1836}, + {47: 1746, 59: 1759, 62: 1745, 65: 1757, 1755, 1750, 220: 1758, 287: 1748, 344: 1754, 352: 1749, 359: 1747, 365: 1744, 370: 1740, 435: 1739, 448: 1752, 454: 1743, 486: 1741, 490: 1753, 497: 1751, 553: 1737, 1736, 561: 1742, 1756, 645: 1817}, + {47: 1746, 59: 1759, 62: 1745, 65: 1757, 1755, 1750, 220: 1758, 287: 1748, 344: 1754, 352: 1749, 359: 1747, 365: 1744, 370: 1740, 435: 1739, 448: 1752, 454: 1743, 486: 1741, 490: 1753, 497: 1751, 553: 1737, 1736, 561: 1742, 1756, 645: 1738}, + {94: 1676, 112: 1675}, + // 90 + {25: 1455, 442: 1456, 666: 1674}, + {25: 1455, 442: 1456, 666: 1454}, + {10: 1450, 64: 1451, 240: 1448, 432: 1449}, + {10: 3, 64: 3, 161: 1447, 240: 3}, + {10: 2, 64: 2, 240: 2}, + // 95 + {1104, 1104, 1104, 1104, 6: 1104, 1104, 1104, 1104, 1104, 1104, 13: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 48: 1104, 55: 1104, 73: 1104, 206: 1104, 1104, 210: 1104, 213: 1104, 218: 1104, 1104, 1104, 1104, 231: 1104, 236: 1104, 239: 1104, 347: 1104, 352: 1104, 1104, 1104, 1104, 1104, 360: 1104}, + {6, 6}, + {240: 1448, 432: 1453}, + {240: 1448, 432: 1452}, + {4, 4}, + // 100 + {5, 5}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 1664, 663: 1665, 783: 1663}, + {14, 14, 14, 14, 14, 14, 7: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 22: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {13, 13, 13, 13, 13, 13, 7: 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 22: 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 352: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010}, + // 105 + {1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 352: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009}, + {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 352: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008}, + {1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 352: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007}, + {1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 352: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 352: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005}, + // 110 + {1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 352: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004}, + {1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 352: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003}, + {1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 352: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002}, + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 352: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001}, + {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 352: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, + // 115 + {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 352: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999}, + {998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 352: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998}, + {997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 352: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 352: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996}, + {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 352: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995}, + // 120 + {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 352: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994}, + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 352: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993}, + {992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 352: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992}, + {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 352: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991}, + {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 352: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990}, + // 125 + {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 352: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989}, + {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 352: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988}, + {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 352: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 352: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986}, + {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 352: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985}, + // 130 + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 352: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984}, + {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 352: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983}, + {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 352: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982}, + {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 352: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981}, + {980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 352: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980}, + // 135 + {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 352: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979}, + {978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 352: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978}, + {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 352: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977}, + {976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 352: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976}, + {975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 352: 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975, 975}, + // 140 + {974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 352: 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974, 974}, + {973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 352: 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973, 973}, + {972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 352: 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972, 972}, + {971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 352: 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971, 971}, + {970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 352: 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970}, + // 145 + {969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 352: 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, 969}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 352: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968}, + {967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 352: 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967}, + {966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 352: 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966, 966}, + {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 352: 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965}, + // 150 + {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 352: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964}, + {963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 352: 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963}, + {962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 352: 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962, 962}, + {961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 352: 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961}, + {960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 352: 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960}, + // 155 + {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 352: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959}, + {958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 352: 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 958}, + {957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 352: 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957, 957}, + {956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 352: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956}, + {955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 352: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955}, + // 160 + {954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 352: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954}, + {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 352: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953}, + {952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 352: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952}, + {951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 352: 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 352: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950}, + // 165 + {949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 352: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949}, + {948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 352: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948}, + {947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 352: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947}, + {946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 352: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946}, + {945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 352: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945}, + // 170 + {944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 352: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944}, + {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 352: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943}, + {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 352: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942}, + {941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 352: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941}, + {940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 352: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940}, + // 175 + {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 352: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939}, + {938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 352: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938}, + {937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 352: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937}, + {936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 352: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936}, + {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 352: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935}, + // 180 + {934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 352: 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934, 934}, + {933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 352: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933}, + {932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 352: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932}, + {931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 352: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931}, + {930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 352: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930}, + // 185 + {929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 352: 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929, 929}, + {928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 352: 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928}, + {927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 352: 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, 927}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 352: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926}, + {925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 352: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925}, + // 190 + {924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 352: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924}, + {923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 352: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923}, + {922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 352: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922}, + {921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 352: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921}, + {920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 352: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920}, + // 195 + {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 352: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919}, + {918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 352: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918}, + {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 352: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917}, + {916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 352: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916}, + {915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 352: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915}, + // 200 + {914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 352: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914}, + {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 352: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913}, + {912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 352: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912}, + {911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 352: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911}, + {910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 352: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910}, + // 205 + {909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 352: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909}, + {908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 352: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908}, + {907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 352: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907}, + {906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 352: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906}, + {905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 352: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905}, + // 210 + {904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 352: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904}, + {903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 352: 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903, 903}, + {902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 352: 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902, 902}, + {901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 352: 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901}, + {900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 352: 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 900}, + // 215 + {899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 352: 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 899}, + {898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 352: 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898, 898}, + {897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 352: 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, 897}, + {896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 352: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896}, + {895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 352: 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895, 895}, + // 220 + {894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 352: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894}, + {893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 352: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893}, + {892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 352: 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892, 892}, + {891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 352: 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891, 891}, + {890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 352: 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, 890}, + // 225 + {889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 352: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889}, + {888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 352: 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888}, + {887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 352: 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887, 887}, + {886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 352: 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886, 886}, + {885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 352: 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885}, + // 230 + {884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 352: 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884, 884}, + {883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 352: 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883}, + {882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 352: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882}, + {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 352: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881}, + {880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 352: 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880, 880}, + // 235 + {879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 352: 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879}, + {878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 352: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878}, + {877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 352: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877}, + {876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 352: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876}, + {875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 352: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875}, + // 240 + {874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 352: 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, 874}, + {873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 352: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873}, + {872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 352: 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872, 872}, + {871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 352: 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, 871}, + {870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 352: 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870, 870}, + // 245 + {869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 352: 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869, 869}, + {868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 352: 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 352: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867}, + {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 352: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866}, + {865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 352: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865}, + // 250 + {864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 352: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864}, + {863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 352: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863}, + {862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 352: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862}, + {861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 352: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861}, + {860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 352: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860}, + // 255 + {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 352: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859}, + {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 352: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858}, + {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 352: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857}, + {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 352: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856}, + {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 352: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855}, + // 260 + {854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 352: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854}, + {853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 352: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853}, + {852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 352: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852}, + {851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 352: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851}, + {850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 352: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850}, + // 265 + {849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 352: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849}, + {848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 352: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848}, + {847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 352: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847}, + {846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 352: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846}, + {845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 352: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845}, + // 270 + {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 352: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844}, + {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 352: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843}, + {842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 352: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842}, + {841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 352: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841}, + {840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 352: 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840, 840}, + // 275 + {839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 352: 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839}, + {838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 352: 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838, 838}, + {837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 352: 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837, 837}, + {836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 352: 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, 836}, + {835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 352: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835}, + // 280 + {834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 352: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834}, + {833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 352: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833}, + {832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 352: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832}, + {831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 352: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831}, + {830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 352: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830}, + // 285 + {829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 352: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829}, + {828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 352: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828}, + {827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 352: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827}, + {826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 352: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826}, + {825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 352: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825}, + // 290 + {824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 352: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824}, + {823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 352: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823}, + {822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 352: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822}, + {821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 352: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821}, + {820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 352: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820}, + // 295 + {819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 352: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819}, + {818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 352: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818}, + {817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 352: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817}, + {816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 352: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816}, + {815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 352: 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815}, + // 300 + {814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 352: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814}, + {813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 352: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813}, + {812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 352: 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812}, + {811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 352: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811}, + {810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 352: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810}, + // 305 + {809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 352: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809}, + {808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 352: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808}, + {807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 352: 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807}, + {806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 352: 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, 806}, + {540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 210: 540, 540, 540, 540, 218: 540, 540, 540, 540, 540, 540, 540, 230: 540, 540, 233: 540, 540, 540, 540, 540, 540, 540, 241: 540, 540, 540, 540, 540, 247: 1672, 264: 540, 292: 540, 296: 540, 347: 540, 352: 540, 540, 540, 540, 540, 359: 540, 540, 363: 540, 540, 540, 540, 540, 540, 540, 540, 540, 377: 540, 380: 540, 383: 540, 405: 540}, + // 310 + {15, 15, 6: 1670}, + {369: 1667, 405: 1668, 740: 1666}, + {8, 8, 6: 8}, + {12, 12, 6: 12}, + {11, 11, 6: 11, 53: 1669}, + // 315 + {9, 9, 6: 9}, + {10, 10, 6: 10}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 1664, 663: 1671}, + {7, 7, 6: 7}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1673, 1459, 1460, 1458}, + // 320 + {539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 210: 539, 539, 539, 539, 218: 539, 539, 539, 539, 539, 539, 539, 230: 539, 539, 233: 539, 539, 539, 539, 539, 539, 539, 241: 539, 539, 539, 539, 539, 264: 539, 292: 539, 296: 539, 347: 539, 352: 539, 539, 539, 539, 539, 359: 539, 539, 363: 539, 539, 539, 539, 539, 539, 539, 539, 539, 377: 539, 380: 539, 383: 539, 405: 539}, + {16, 16}, + {53: 1679, 547: 34, 738: 1678}, + {208: 1677}, + {1, 1}, + // 325 + {547: 1680}, + {547: 33}, + {208: 1681}, + {463: 1682}, + {442: 1683}, + // 330 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 1684}, + {36, 36, 27: 36, 29: 36, 206: 36, 347: 36, 353: 1686, 360: 36, 689: 1685}, + {32, 32, 27: 1696, 29: 1695, 206: 32, 347: 32, 360: 32, 713: 1693, 1694}, + {234: 1687}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 1692}, + // 335 + {399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 13: 399, 399, 399, 399, 399, 399, 399, 399, 399, 27: 399, 29: 399, 206: 399, 399, 209: 399, 399, 213: 399, 217: 399, 236: 399, 239: 399, 248: 399, 291: 399, 341: 399, 399, 399, 399, 399, 347: 399, 352: 399, 399, 399, 399, 399, 360: 399}, + {398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 13: 398, 398, 398, 398, 398, 398, 398, 398, 398, 27: 398, 29: 398, 206: 398, 398, 209: 398, 398, 213: 398, 217: 398, 236: 398, 239: 398, 248: 398, 291: 398, 341: 398, 398, 398, 398, 398, 347: 398, 352: 398, 398, 398, 398, 398, 360: 398}, + {110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 241: 110, 110, 110, 110, 110, 110, 248: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 283: 110, 110, 110, 289: 110, 291: 110, 341: 110, 110, 110, 110, 110, 110, 110, 352: 110, 110, 110, 110, 110, 360: 110, 110, 110, 379: 110}, + {109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 241: 109, 109, 109, 109, 109, 109, 248: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 283: 109, 109, 109, 289: 109, 291: 109, 341: 109, 109, 109, 109, 109, 109, 109, 352: 109, 109, 109, 109, 109, 360: 109, 109, 109, 379: 109}, + {35, 35, 27: 35, 29: 35, 206: 35, 347: 35, 360: 35}, + // 340 + {22, 22, 206: 22, 347: 22, 360: 1710, 736: 1709}, + {28, 28, 206: 28, 347: 28, 360: 28, 479: 28, 501: 1698, 507: 28, 715: 1697}, + {30, 30, 206: 30, 347: 30, 360: 30, 479: 30, 501: 30, 507: 30}, + {29, 29, 206: 29, 347: 29, 360: 29, 479: 29, 501: 29, 507: 29}, + {26, 26, 206: 26, 347: 26, 360: 26, 479: 26, 507: 1702, 709: 1701}, + // 345 + {362: 1699}, + {208: 1700}, + {27, 27, 206: 27, 347: 27, 360: 27, 479: 27, 507: 27}, + {24, 24, 206: 24, 347: 24, 360: 24, 479: 1706, 710: 1705}, + {362: 1703}, + // 350 + {208: 1704}, + {25, 25, 206: 25, 347: 25, 360: 25, 479: 25}, + {31, 31, 206: 31, 347: 31, 360: 31}, + {362: 1707}, + {208: 1708}, + // 355 + {23, 23, 206: 23, 347: 23, 360: 23}, + {38, 38, 206: 38, 347: 1720, 725: 1719}, + {20, 20, 206: 20, 347: 20, 501: 20, 774: 1711, 1712}, + {18, 18, 206: 18, 347: 18, 501: 1716, 737: 1715}, + {362: 1713}, + // 360 + {208: 1714}, + {19, 19, 206: 19, 347: 19, 501: 19}, + {21, 21, 206: 21, 347: 21}, + {362: 1717}, + {208: 1718}, + // 365 + {17, 17, 206: 17, 347: 17}, + {1269, 1269, 206: 1723, 692: 1724}, + {240: 1448, 432: 1721}, + {360: 1722}, + {37, 37, 206: 37}, + // 370 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1271, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 1727, 574: 1728}, + {39, 39}, + {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 232: 1276, 234: 1276, 247: 1732, 1276, 1276, 1276, 290: 1276, 365: 1276, 1276, 1276, 374: 1276, 1276, 1276, 378: 1276, 381: 1276, 1276, 384: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276}, + {6: 1273, 21: 1273}, + {6: 1730, 21: 1270}, + // 375 + {21: 1729}, + {1268, 1268}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1731}, + {6: 1272, 21: 1272}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1733, 1459, 1460, 1458}, + // 380 + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 232: 1275, 234: 1275, 247: 1734, 1275, 1275, 1275, 290: 1275, 365: 1275, 1275, 1275, 374: 1275, 1275, 1275, 378: 1275, 381: 1275, 1275, 384: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1735, 1459, 1460, 1458}, + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 232: 1274, 234: 1274, 248: 1274, 1274, 1274, 290: 1274, 365: 1274, 1274, 1274, 374: 1274, 1274, 1274, 378: 1274, 381: 1274, 1274, 384: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274}, + {6: 80, 206: 1814, 80}, + {6: 78, 207: 78}, + // 385 + {6: 1773, 207: 1774}, + {6: 76, 45: 1772, 206: 76, 76}, + {6: 74, 92: 1771, 206: 74, 74}, + {6: 73, 22: 1768, 57: 1766, 92: 1769, 157: 1767, 206: 73, 73}, + {6: 71, 206: 71, 71}, + // 390 + {6: 70, 206: 70, 70}, + {6: 69, 206: 69, 69}, + {6: 68, 206: 68, 68}, + {6: 67, 206: 67, 67}, + {6: 66, 206: 66, 66}, + // 395 + {6: 65, 206: 65, 65}, + {6: 64, 206: 64, 64}, + {6: 63, 206: 63, 63}, + {22: 1765, 584: 1764}, + {6: 61, 206: 61, 61}, + // 400 + {525: 1763}, + {6: 59, 206: 59, 59}, + {108: 1762, 150: 1761}, + {6: 56, 206: 56, 56}, + {6: 55, 206: 55, 55}, + // 405 + {25: 1760}, + {6: 48, 206: 48, 48}, + {6: 53, 206: 53, 53}, + {6: 58, 206: 58, 58}, + {6: 57, 206: 57, 57}, + // 410 + {6: 60, 206: 60, 60}, + {6: 62, 206: 62, 62}, + {6: 51, 206: 51, 51}, + {6: 72, 206: 72, 72}, + {25: 1770}, + // 415 + {6: 52, 206: 52, 52}, + {6: 50, 206: 50, 50}, + {6: 54, 206: 54, 54}, + {6: 49, 206: 49, 49}, + {6: 75, 206: 75, 75}, + // 420 + {47: 1746, 59: 1759, 62: 1745, 65: 1757, 1755, 1750, 220: 1758, 287: 1748, 344: 1754, 352: 1749, 359: 1747, 365: 1744, 370: 1740, 435: 1739, 448: 1752, 454: 1743, 486: 1741, 490: 1753, 497: 1751, 553: 1813, 1736, 561: 1742, 1756}, + {2: 47, 47, 47, 47, 7: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 22: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 246: 47, 442: 1775, 630: 1776}, + {2: 46, 46, 46, 46, 7: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 22: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 246: 46}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 1777, 348: 1778, 1459, 1460, 1458, 646: 1779}, + {230: 45, 247: 1811, 368: 45}, + // 425 + {230: 41, 247: 1808, 368: 41}, + {230: 1780}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 1785}, + {390, 390, 6: 390, 22: 390, 30: 390, 218: 390, 232: 390, 289: 1806, 361: 390, 379: 1805}, + {664, 664, 6: 664, 22: 664, 30: 664, 206: 1802, 218: 664, 232: 664, 361: 664, 636: 1803}, + // 430 + {94, 94, 6: 94, 30: 1789, 218: 94, 683: 1788}, + {96, 96, 6: 96, 218: 96}, + {40, 40, 6: 1786}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1787}, + {95, 95, 6: 95, 218: 95}, + // 435 + {97, 97, 6: 97, 218: 97}, + {218: 1791, 362: 1790}, + {11: 1800, 208: 1797, 520: 1799}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 1792}, + {92, 92, 6: 92, 210: 1794, 218: 92, 362: 1793}, + // 440 + {208: 1797, 520: 1798}, + {208: 1796, 611: 1795}, + {90, 90, 6: 90, 218: 90}, + {88, 88, 6: 88, 218: 88}, + {382, 382, 6: 382, 21: 382, 218: 382}, + // 445 + {91, 91, 6: 91, 218: 91}, + {93, 93, 6: 93, 218: 93}, + {208: 1796, 611: 1801}, + {89, 89, 6: 89, 218: 89}, + {21: 1804}, + // 450 + {387, 387, 6: 387, 22: 387, 30: 387, 218: 387, 232: 387, 361: 387}, + {663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 207: 663, 663, 663, 663, 663, 663, 214: 663, 663, 663, 218: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 237: 663, 663, 663, 241: 663, 663, 663, 663, 663, 663, 249: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 283: 663, 663, 663, 346: 663, 361: 663}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 1807}, + {388, 388, 6: 388, 22: 388, 30: 388, 218: 388, 232: 388, 361: 388}, + {389, 389, 6: 389, 22: 389, 30: 389, 218: 389, 232: 389, 361: 389}, + // 455 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 1809, 348: 1810, 1459, 1460, 1458}, + {230: 43, 368: 43}, + {230: 42, 368: 42}, + {246: 1812}, + {230: 44, 368: 44}, + // 460 + {6: 77, 207: 77}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 1815}, + {6: 1730, 21: 1816}, + {6: 79, 207: 79}, + {6: 1773, 207: 1818}, + // 465 + {2: 47, 47, 47, 47, 7: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 22: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 246: 47, 442: 1775, 630: 1819}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 1777, 348: 1778, 1459, 1460, 1458, 646: 1820}, + {368: 1821}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 1822}, + {86, 86, 6: 1786, 218: 1824, 808: 1823}, + // 470 + {87, 87}, + {130: 1828, 1826, 1827, 1829, 490: 1825}, + {525: 1834}, + {240: 1448, 432: 1833}, + {240: 1448, 432: 1832}, + // 475 + {240: 1448, 432: 1831}, + {240: 1448, 432: 1830}, + {81, 81}, + {82, 82}, + {83, 83}, + // 480 + {84, 84}, + {85, 85}, + {1204, 1204, 7: 1204, 213: 1204, 224: 1204, 239: 1204, 245: 1204, 353: 1204}, + {106, 106}, + {31: 2533, 2532, 2531, 2530, 664: 2529, 785: 2528}, + // 485 + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 288: 544, 347: 544, 450: 1841, 1840, 1839, 515: 1842}, + {2: 543, 543, 543, 543, 7: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 22: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 208: 543, 543, 211: 543, 543, 543, 543, 543, 543, 543, 230: 543, 233: 543, 236: 543, 240: 543, 246: 543, 543, 543, 282: 543, 286: 543, 543, 543, 543, 543, 292: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 347: 543, 447: 543, 463: 543}, + {2: 542, 542, 542, 542, 7: 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 22: 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 208: 542, 542, 211: 542, 542, 542, 542, 542, 542, 542, 230: 542, 233: 542, 236: 542, 240: 542, 246: 542, 542, 542, 282: 542, 286: 542, 542, 542, 542, 542, 292: 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 347: 542, 447: 542, 463: 542}, + {2: 541, 541, 541, 541, 7: 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 22: 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 208: 541, 541, 211: 541, 541, 541, 541, 541, 541, 541, 230: 541, 233: 541, 236: 541, 240: 541, 246: 541, 541, 541, 282: 541, 286: 541, 541, 541, 541, 541, 292: 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 347: 541, 447: 541, 463: 541}, + {2: 1023, 1023, 1023, 1023, 7: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 22: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 288: 1023, 347: 1843, 521: 1844}, + // 490 + {2: 1022, 1022, 1022, 1022, 7: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 22: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 230: 1022, 288: 1022, 442: 1022, 463: 1022}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1847, 480: 1845, 500: 1846}, + {515, 515, 6: 515, 21: 515, 207: 515, 218: 515, 515, 515, 515, 515, 515, 515, 234: 515, 515, 238: 515}, + {6: 2473, 234: 2525}, + {6: 513, 211: 1871, 1872, 233: 1870, 2507, 237: 1873, 241: 1874, 1875, 1869, 465: 1868, 471: 1867}, + // 495 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2504, 1459, 1460, 1458}, + {511, 511, 6: 511, 21: 511, 207: 511, 211: 511, 511, 218: 511, 511, 511, 511, 511, 511, 511, 231: 511, 233: 511, 511, 511, 237: 511, 511, 241: 511, 511, 511, 511}, + {510, 510, 6: 510, 21: 510, 207: 510, 211: 510, 510, 218: 510, 510, 510, 510, 510, 510, 510, 231: 510, 233: 510, 510, 510, 237: 510, 510, 241: 510, 510, 510, 510}, + {505, 505, 1540, 1463, 1464, 1496, 505, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 505, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 505, 210: 1861, 505, 505, 218: 505, 505, 505, 505, 505, 505, 505, 231: 505, 233: 505, 505, 505, 237: 505, 505, 241: 505, 505, 505, 505, 347: 505, 1860, 1459, 1460, 1458, 363: 505, 505, 529: 2477, 780: 2476}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1855, 288: 1848, 348: 1662, 1459, 1460, 1458, 1379, 429: 1851, 437: 1856, 1380, 1381, 1382, 444: 1385, 1384, 1857, 456: 1850, 1849, 1854, 480: 1845, 500: 1853}, + // 500 + {6: 2473, 21: 2474}, + {513, 513, 6: 513, 21: 513, 207: 513, 211: 1871, 1872, 218: 513, 513, 513, 513, 513, 513, 513, 233: 1870, 513, 513, 237: 1873, 513, 241: 1874, 1875, 1869, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1855, 288: 1848, 348: 1662, 1459, 1460, 1458, 1379, 429: 1851, 437: 1865, 1380, 1381, 1382, 444: 1385, 1384, 1857, 456: 1850, 1849, 1854, 480: 1845, 500: 1853}, + {21: 1863, 219: 430}, + {21: 1858}, + // 505 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 1861, 348: 1860, 1459, 1460, 1458, 529: 1859}, + {507, 507, 6: 507, 21: 507, 207: 507, 211: 507, 507, 218: 507, 507, 507, 507, 507, 507, 507, 231: 507, 233: 507, 507, 507, 237: 507, 507, 241: 507, 507, 507, 507}, + {503, 503, 6: 503, 21: 503, 207: 503, 211: 503, 503, 218: 503, 503, 503, 503, 503, 503, 503, 231: 503, 233: 503, 503, 503, 237: 503, 503, 241: 503, 503, 503, 503, 347: 503, 363: 503, 503}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1862, 1459, 1460, 1458}, + {502, 502, 6: 502, 21: 502, 207: 502, 211: 502, 502, 218: 502, 502, 502, 502, 502, 502, 502, 231: 502, 233: 502, 502, 502, 237: 502, 502, 241: 502, 502, 502, 502, 347: 502, 363: 502, 502}, + // 510 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 1861, 348: 1860, 1459, 1460, 1458, 529: 1864}, + {508, 508, 6: 508, 21: 508, 207: 508, 211: 508, 508, 218: 508, 508, 508, 508, 508, 508, 508, 231: 508, 233: 508, 508, 508, 237: 508, 508, 241: 508, 508, 508, 508}, + {21: 1866, 219: 430}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 1861, 219: 429, 348: 1860, 1459, 1460, 1458, 529: 1864}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2466}, + // 515 + {237: 475, 526: 2453, 638: 2457}, + {211: 1871, 1872, 237: 2450, 465: 2451}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1878}, + {237: 477, 526: 477}, + {237: 476, 526: 476}, + // 520 + {2: 473, 473, 473, 473, 7: 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 22: 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473}, + {237: 1877}, + {237: 1876}, + {2: 471, 471, 471, 471, 7: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 22: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471}, + {2: 472, 472, 472, 472, 7: 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 22: 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472}, + // 525 + {479, 479, 6: 479, 21: 479, 207: 1879, 211: 479, 479, 218: 479, 479, 479, 479, 479, 479, 479, 231: 479, 233: 479, 479, 479, 237: 479, 479, 241: 479, 479, 479, 479, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 1881}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 207: 391, 391, 391, 391, 391, 391, 214: 391, 391, 391, 218: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 237: 391, 391, 391, 241: 391, 391, 391, 391, 391, 391, 249: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 283: 391, 391, 391, 346: 391, 532: 2448}, + {478, 478, 6: 478, 21: 478, 207: 478, 211: 478, 478, 218: 478, 478, 478, 478, 478, 478, 478, 2014, 2012, 2013, 2011, 2009, 231: 478, 233: 478, 478, 478, 237: 478, 478, 241: 478, 478, 478, 478, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2447}, + // 530 + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 207: 1095, 1095, 210: 1095, 1095, 1095, 218: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 2430, 1095, 1095, 1095, 237: 1095, 1095, 241: 1095, 1095, 1095, 1095, 249: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 265: 1095, 2427, 2425, 2424, 2432, 2426, 2428, 2429, 2431, 696: 2423, 730: 2422}, + {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 207: 1075, 1075, 210: 1075, 1075, 1075, 218: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 237: 1075, 1075, 241: 1075, 1075, 1075, 1075, 249: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 265: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075}, + {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 207: 1048, 1048, 2396, 1048, 1048, 1048, 214: 2117, 2118, 2123, 218: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 237: 1048, 1048, 241: 1048, 1048, 1048, 1048, 2398, 2119, 249: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 2397, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116, 283: 2395, 2404, 2405, 648: 2399, 684: 2401, 727: 2400, 734: 2402, 764: 2403}, + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 2392, 1010, 1010, 1010, 1010, 1010, 1010, 214: 1010, 1010, 1010, 218: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 237: 1010, 1010, 1010, 241: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 249: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 283: 1010, 1010, 1010, 346: 1010, 357: 1010, 1010}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 693, 1005, 1005, 1005, 1005, 1005, 1005, 214: 1005, 1005, 1005, 218: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 237: 1005, 1005, 1005, 241: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 249: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 283: 1005, 1005, 1005, 346: 1005, 357: 1005, 1005}, + // 535 + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 2388, 1001, 1001, 1001, 1001, 1001, 1001, 214: 1001, 1001, 1001, 218: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 237: 1001, 1001, 1001, 241: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 249: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 283: 1001, 1001, 1001, 346: 1001, 357: 1001, 1001}, + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 692, 993, 993, 993, 993, 993, 993, 214: 993, 993, 993, 218: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 237: 993, 993, 993, 241: 993, 993, 993, 993, 993, 993, 993, 249: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 283: 993, 993, 993, 346: 993, 357: 993, 993}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 689, 986, 2387, 986, 986, 986, 986, 214: 986, 986, 986, 218: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 237: 986, 986, 986, 241: 986, 986, 986, 986, 986, 986, 986, 249: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 283: 986, 986, 986, 346: 986, 357: 986, 986}, + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 687, 984, 984, 984, 984, 984, 984, 214: 984, 984, 984, 218: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 237: 984, 984, 984, 241: 984, 984, 984, 984, 984, 984, 984, 249: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 283: 984, 984, 984, 346: 984, 357: 984, 984}, + {968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 683, 968, 968, 968, 968, 968, 968, 214: 968, 968, 968, 218: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 237: 968, 968, 968, 241: 968, 968, 968, 968, 968, 968, 968, 249: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 283: 968, 968, 968, 346: 968, 357: 968, 968}, + // 540 + {964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 686, 964, 964, 964, 964, 964, 964, 214: 964, 964, 964, 218: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 237: 964, 964, 964, 241: 964, 964, 964, 964, 964, 964, 964, 249: 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 964, 283: 964, 964, 964, 346: 964, 357: 964, 964}, + {959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 2384, 959, 959, 959, 959, 959, 959, 214: 959, 959, 959, 218: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 237: 959, 959, 959, 241: 959, 959, 959, 959, 959, 959, 959, 249: 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 959, 283: 959, 959, 959, 346: 959, 357: 959, 959}, + {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 670, 943, 2383, 943, 943, 943, 943, 214: 943, 943, 943, 218: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 237: 943, 943, 943, 241: 943, 943, 943, 943, 943, 943, 943, 249: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 283: 943, 943, 943, 346: 943, 357: 943, 943}, + {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 669, 942, 2382, 942, 942, 942, 942, 214: 942, 942, 942, 218: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 237: 942, 942, 942, 241: 942, 942, 942, 942, 942, 942, 942, 249: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 283: 942, 942, 942, 346: 942, 357: 942, 942}, + {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 668, 939, 939, 939, 939, 939, 939, 214: 939, 939, 939, 218: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 237: 939, 939, 939, 241: 939, 939, 939, 939, 939, 939, 939, 249: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 283: 939, 939, 939, 346: 939, 357: 939, 939}, + // 545 + {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 665, 935, 935, 935, 935, 935, 935, 214: 935, 935, 935, 218: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 237: 935, 935, 935, 241: 935, 935, 935, 935, 935, 935, 935, 249: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 283: 935, 935, 935, 346: 935, 357: 935, 935}, + {933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 666, 933, 933, 933, 933, 933, 933, 214: 933, 933, 933, 218: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 237: 933, 933, 933, 241: 933, 933, 933, 933, 933, 933, 933, 249: 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 283: 933, 933, 933, 346: 933, 357: 933, 933}, + {930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 667, 930, 930, 930, 930, 930, 930, 214: 930, 930, 930, 218: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 237: 930, 930, 930, 241: 930, 930, 930, 930, 930, 930, 930, 249: 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 283: 930, 930, 930, 346: 930, 357: 930, 930}, + {928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 690, 928, 928, 928, 928, 928, 928, 214: 928, 928, 928, 218: 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 237: 928, 928, 928, 241: 928, 928, 928, 928, 928, 928, 928, 249: 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, 283: 928, 928, 928, 346: 928, 357: 928, 928}, + {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 2377, 917, 917, 917, 917, 917, 917, 214: 917, 917, 917, 218: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 237: 917, 917, 917, 241: 917, 917, 917, 917, 917, 917, 917, 249: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 283: 917, 917, 917, 346: 917, 357: 917, 917}, + // 550 + {915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 677, 915, 915, 915, 915, 915, 915, 214: 915, 915, 915, 218: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 237: 915, 915, 915, 241: 915, 915, 915, 915, 915, 915, 915, 249: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 283: 915, 915, 915, 346: 915, 357: 915, 915}, + {896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 674, 896, 896, 896, 896, 896, 896, 214: 896, 896, 896, 218: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 237: 896, 896, 896, 241: 896, 896, 896, 896, 896, 896, 896, 249: 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 896, 283: 896, 896, 896, 346: 896, 357: 896, 896}, + {883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 672, 883, 883, 883, 883, 883, 883, 214: 883, 883, 883, 218: 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 237: 883, 883, 883, 241: 883, 883, 883, 883, 883, 883, 883, 249: 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 283: 883, 883, 883, 346: 883, 357: 883, 883}, + {882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 691, 882, 882, 882, 882, 882, 882, 214: 882, 882, 882, 218: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 237: 882, 882, 882, 241: 882, 882, 882, 882, 882, 882, 882, 249: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 283: 882, 882, 882, 346: 882, 357: 882, 882}, + {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 679, 881, 881, 881, 881, 881, 881, 214: 881, 881, 881, 218: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 237: 881, 881, 881, 241: 881, 881, 881, 881, 881, 881, 881, 249: 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 283: 881, 881, 881, 346: 881, 357: 881, 881}, + // 555 + {878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 681, 878, 878, 878, 878, 878, 878, 214: 878, 878, 878, 218: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 237: 878, 878, 878, 241: 878, 878, 878, 878, 878, 878, 878, 249: 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 878, 283: 878, 878, 878, 346: 878, 357: 878, 878}, + {877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 680, 877, 877, 877, 877, 877, 877, 214: 877, 877, 877, 218: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 237: 877, 877, 877, 241: 877, 877, 877, 877, 877, 877, 877, 249: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 283: 877, 877, 877, 346: 877, 357: 877, 877}, + {873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 671, 873, 873, 873, 873, 873, 873, 214: 873, 873, 873, 218: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 237: 873, 873, 873, 241: 873, 873, 873, 873, 873, 873, 873, 249: 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 873, 283: 873, 873, 873, 346: 873, 357: 873, 873}, + {822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 2368, 822, 822, 822, 822, 822, 822, 214: 822, 822, 822, 218: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 237: 822, 822, 822, 241: 822, 822, 822, 822, 822, 822, 822, 249: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 283: 822, 822, 822, 346: 822, 357: 822, 822}, + {809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 2361, 809, 809, 809, 809, 809, 809, 214: 809, 809, 809, 218: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 237: 809, 809, 809, 241: 809, 809, 809, 809, 809, 809, 809, 249: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 283: 809, 809, 809, 346: 809, 357: 809, 809}, + // 560 + {808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 2345, 808, 808, 808, 808, 808, 808, 214: 808, 808, 808, 218: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 237: 808, 808, 808, 241: 808, 808, 808, 808, 808, 808, 808, 249: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 283: 808, 808, 808, 346: 808, 357: 808, 808}, + {772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 207: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 237: 772, 772, 772, 241: 772, 772, 772, 772, 772, 772, 249: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 283: 772, 772, 772, 291: 772, 341: 772, 772, 772, 772, 772, 772}, + {771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 207: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 237: 771, 771, 771, 241: 771, 771, 771, 771, 771, 771, 249: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 283: 771, 771, 771, 291: 771, 341: 771, 771, 771, 771, 771, 771}, + {770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 207: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 237: 770, 770, 770, 241: 770, 770, 770, 770, 770, 770, 249: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 283: 770, 770, 770, 291: 770, 341: 770, 770, 770, 770, 770, 770}, + {769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 207: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 237: 769, 769, 769, 241: 769, 769, 769, 769, 769, 769, 249: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 283: 769, 769, 769, 291: 769, 341: 769, 769, 769, 769, 769, 769}, + // 565 + {768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 207: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 237: 768, 768, 768, 241: 768, 768, 768, 768, 768, 768, 249: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 283: 768, 768, 768, 291: 768, 341: 768, 768, 768, 768, 768, 768}, + {767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 207: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 237: 767, 767, 767, 241: 767, 767, 767, 767, 767, 767, 249: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 283: 767, 767, 767, 291: 767, 341: 767, 767, 767, 767, 767, 767}, + {766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 207: 766, 2344, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 237: 766, 766, 766, 241: 766, 766, 766, 766, 766, 766, 249: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 283: 766, 766, 766, 291: 766, 341: 766, 766, 766, 766, 766, 766}, + {208: 2343}, + {764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 207: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 237: 764, 764, 764, 241: 764, 764, 764, 764, 764, 764, 249: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 283: 764, 764, 764, 291: 764, 341: 764, 764, 764, 764, 764, 764}, + // 570 + {763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 207: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 237: 763, 763, 763, 241: 763, 763, 763, 763, 763, 763, 249: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 283: 763, 763, 763, 291: 763, 341: 763, 763, 763, 763, 763, 763}, + {762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 207: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 237: 762, 762, 762, 241: 762, 762, 762, 762, 762, 762, 249: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 283: 762, 762, 762, 291: 762, 341: 762, 762, 762, 762, 762, 762}, + {737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 207: 737, 737, 737, 737, 737, 737, 214: 737, 737, 737, 218: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 237: 737, 737, 2305, 241: 737, 737, 737, 737, 737, 737, 249: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 283: 737, 737, 737, 346: 2306}, + {736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 207: 736, 736, 736, 736, 736, 736, 214: 736, 736, 736, 218: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 237: 736, 736, 736, 241: 736, 736, 736, 736, 736, 736, 2339, 249: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 283: 736, 736, 736, 346: 736, 357: 736, 736}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2336, 1459, 1460, 1458}, + // 575 + {732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 207: 732, 732, 732, 732, 732, 732, 214: 732, 732, 732, 218: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 237: 732, 732, 732, 241: 732, 732, 732, 732, 732, 732, 249: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 283: 732, 732, 732, 346: 732, 357: 2332, 2333}, + {731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 207: 731, 731, 731, 731, 731, 731, 214: 731, 731, 731, 218: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 237: 731, 731, 731, 241: 731, 731, 731, 731, 731, 731, 249: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 283: 731, 731, 731, 346: 731}, + {730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 207: 730, 730, 730, 730, 730, 730, 214: 730, 730, 730, 218: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 237: 730, 730, 730, 241: 730, 730, 730, 730, 730, 730, 249: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 283: 730, 730, 730, 346: 730}, + {729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 207: 729, 729, 729, 729, 729, 729, 214: 729, 729, 729, 218: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 237: 729, 729, 729, 241: 729, 729, 729, 729, 729, 729, 249: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 283: 729, 729, 729, 346: 729}, + {727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 207: 727, 727, 727, 727, 727, 727, 214: 727, 727, 727, 218: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 237: 727, 727, 727, 241: 727, 727, 727, 727, 727, 727, 249: 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, 283: 727, 727, 727, 346: 727}, + // 580 + {726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 207: 726, 726, 726, 726, 726, 726, 214: 726, 726, 726, 218: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 237: 726, 726, 726, 241: 726, 726, 726, 726, 726, 726, 249: 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 283: 726, 726, 726, 346: 726}, + {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 207: 725, 725, 725, 725, 725, 725, 214: 725, 725, 725, 218: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 237: 725, 725, 725, 241: 725, 725, 725, 725, 725, 725, 249: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 283: 725, 725, 725, 346: 725}, + {724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 207: 724, 724, 724, 724, 724, 724, 214: 724, 724, 724, 218: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 237: 724, 724, 724, 241: 724, 724, 724, 724, 724, 724, 249: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 283: 724, 724, 724, 346: 724}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2331, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2330, 1935, 1996, 1934}, + // 585 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2329, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2328, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2327, 1935, 1996, 1934}, + {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 207: 717, 717, 717, 717, 717, 717, 214: 717, 717, 717, 218: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 237: 717, 717, 717, 241: 717, 717, 717, 717, 717, 717, 249: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 283: 717, 717, 717, 346: 717}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 2320, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 1379, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2318, 437: 2311, 1380, 1381, 1382, 444: 1385, 1384, 2312, 455: 2319}, + // 590 + {206: 2310, 406: 2309}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2304, 1935, 1996, 1934}, + {206: 2299}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 251: 560, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2286, 711: 2287}, + {206: 2236}, + // 595 + {206: 2233}, + {206: 2230}, + {206: 688}, + {206: 685}, + {206: 684}, + // 600 + {206: 682}, + {206: 678}, + {206: 676}, + {206: 675}, + {206: 673}, + // 605 + {662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 214: 662, 662, 662, 218: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 237: 662, 662, 662, 241: 662, 662, 662, 662, 662, 662, 249: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 283: 662, 662, 662, 346: 662}, + {661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 214: 661, 661, 661, 218: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 237: 661, 661, 661, 241: 661, 661, 661, 661, 661, 661, 249: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 283: 661, 661, 661, 346: 661}, + {660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 214: 660, 660, 660, 218: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 237: 660, 660, 660, 241: 660, 660, 660, 660, 660, 660, 249: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 283: 660, 660, 660, 346: 660}, + {659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 214: 659, 659, 659, 218: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 237: 659, 659, 659, 241: 659, 659, 659, 659, 659, 659, 249: 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 283: 659, 659, 659, 346: 659}, + {658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 214: 658, 658, 658, 218: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 237: 658, 658, 658, 241: 658, 658, 658, 658, 658, 658, 249: 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 283: 658, 658, 658, 346: 658}, + // 610 + {657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 214: 657, 657, 657, 218: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 237: 657, 657, 657, 241: 657, 657, 657, 657, 657, 657, 249: 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 283: 657, 657, 657, 346: 657}, + {656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 214: 656, 656, 656, 218: 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 237: 656, 656, 656, 241: 656, 656, 656, 656, 656, 656, 249: 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 283: 656, 656, 656, 346: 656}, + {655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 214: 655, 655, 655, 218: 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 237: 655, 655, 655, 241: 655, 655, 655, 655, 655, 655, 249: 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 283: 655, 655, 655, 346: 655}, + {654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 214: 654, 654, 654, 218: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 237: 654, 654, 654, 241: 654, 654, 654, 654, 654, 654, 249: 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 283: 654, 654, 654, 346: 654}, + {206: 2227}, + // 615 + {206: 2224}, + {664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 1802, 664, 664, 664, 664, 664, 664, 214: 664, 664, 664, 218: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 237: 664, 664, 664, 241: 664, 664, 664, 664, 664, 664, 249: 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 283: 664, 664, 664, 346: 664, 636: 2223}, + {206: 2221}, + {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 2217, 592, 592, 592, 592, 592, 592, 214: 592, 592, 592, 218: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 237: 592, 592, 592, 241: 592, 592, 592, 592, 592, 592, 249: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 283: 592, 592, 592, 346: 592, 719: 2216}, + {206: 2210}, + // 620 + {206: 2206}, + {206: 2201}, + {631: 2198, 2195, 2197, 2196}, + {206: 2192}, + {206: 2187}, + // 625 + {206: 2178}, + {206: 2171}, + {206: 2166}, + {206: 2110}, + {206: 2096}, + // 630 + {206: 2079}, + {206: 617}, + {206: 616}, + {206: 615}, + {206: 614}, + // 635 + {206: 2073}, + {206: 2067}, + {206: 2061}, + {206: 2050}, + {206: 2028}, + // 640 + {206: 2024}, + {206: 2020}, + {206: 1999}, + {394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 207: 394, 394, 394, 394, 394, 394, 214: 394, 394, 394, 218: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 237: 394, 394, 394, 241: 394, 394, 394, 394, 394, 394, 249: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 283: 394, 394, 394, 346: 394}, + {393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 207: 393, 393, 393, 393, 393, 393, 214: 393, 393, 393, 218: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 237: 393, 393, 393, 241: 393, 393, 393, 393, 393, 393, 249: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 283: 393, 393, 393, 346: 393}, + // 645 + {392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 207: 392, 392, 392, 392, 392, 392, 214: 392, 392, 392, 218: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 237: 392, 392, 392, 241: 392, 392, 392, 392, 392, 392, 249: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 283: 392, 392, 392, 346: 392}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2006}, + {2: 703, 703, 703, 703, 7: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 22: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 208: 703, 703, 211: 703, 703, 703, 703, 703, 703, 703, 233: 703, 236: 703, 240: 703, 246: 703, 703, 703, 282: 703, 286: 703, 703, 703, 703, 703, 292: 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 703, 352: 703, 435: 703, 447: 703, 450: 703, 703, 703}, + {2: 702, 702, 702, 702, 7: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 22: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 208: 702, 702, 211: 702, 702, 702, 702, 702, 702, 702, 233: 702, 236: 702, 240: 702, 246: 702, 702, 702, 282: 702, 286: 702, 702, 702, 702, 702, 292: 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 352: 702, 435: 702, 447: 702, 450: 702, 702, 702}, + {2: 701, 701, 701, 701, 7: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 22: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 208: 701, 701, 211: 701, 701, 701, 701, 701, 701, 701, 233: 701, 236: 701, 240: 701, 246: 701, 701, 701, 282: 701, 286: 701, 701, 701, 701, 701, 292: 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 352: 701, 447: 701, 450: 701, 701, 701}, + // 650 + {2: 700, 700, 700, 700, 7: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 22: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 208: 700, 700, 211: 700, 700, 700, 700, 700, 700, 700, 236: 700, 240: 700, 247: 700, 700, 282: 700, 286: 700, 700, 700, 700, 700, 292: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 435: 2019}, + {2: 698, 698, 698, 698, 7: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 22: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 208: 698, 698, 211: 698, 698, 698, 698, 698, 698, 698, 233: 698, 236: 698, 240: 698, 246: 698, 698, 698, 282: 698, 286: 698, 698, 698, 698, 698, 292: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 447: 698, 450: 698, 698, 698}, + {2: 695, 695, 695, 695, 7: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 22: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 208: 695, 695, 211: 695, 695, 695, 695, 695, 695, 695, 236: 695, 240: 695, 247: 695, 695, 282: 695, 286: 695, 695, 695, 695, 695, 292: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2007}, + {21: 2015, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 655 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2018}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2017}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2016}, + {2: 1092, 1092, 1092, 1092, 7: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 22: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 208: 1092, 1092, 211: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 236: 1092, 240: 1092, 247: 1092, 1092, 282: 1092, 286: 1092, 1092, 1092, 1092, 1092, 292: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092}, + {2: 1091, 1091, 1091, 1091, 7: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 22: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 208: 1091, 1091, 211: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 236: 1091, 240: 1091, 247: 1091, 1091, 282: 1091, 286: 1091, 1091, 1091, 1091, 1091, 292: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091}, + // 660 + {2: 1090, 1090, 1090, 1090, 7: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 22: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 208: 1090, 1090, 211: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 236: 1090, 240: 1090, 247: 1090, 1090, 282: 1090, 286: 1090, 1090, 1090, 1090, 1090, 292: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090}, + {2: 1089, 1089, 1089, 1089, 7: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 22: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 208: 1089, 1089, 211: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 236: 1089, 240: 1089, 247: 1089, 1089, 282: 1089, 286: 1089, 1089, 1089, 1089, 1089, 292: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089}, + {596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 207: 596, 596, 596, 596, 596, 596, 214: 596, 596, 596, 218: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 237: 596, 596, 596, 241: 596, 596, 596, 596, 596, 596, 249: 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 283: 596, 596, 596, 346: 596}, + {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 207: 1100, 1100, 210: 1100, 1100, 1100, 218: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 233: 1100, 1100, 1100, 237: 1100, 1100, 241: 1100, 1100, 1100, 1100, 249: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 265: 1100, 427: 2010, 2008}, + {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 207: 1101, 1101, 210: 1101, 1101, 1101, 218: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 2014, 1101, 2013, 1101, 1101, 1101, 1101, 233: 1101, 1101, 1101, 237: 1101, 1101, 241: 1101, 1101, 1101, 1101, 249: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 265: 1101, 427: 2010, 2008}, + // 665 + {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 207: 1102, 1102, 210: 1102, 1102, 1102, 218: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 2014, 1102, 2013, 1102, 2009, 1102, 1102, 233: 1102, 1102, 1102, 237: 1102, 1102, 241: 1102, 1102, 1102, 1102, 249: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 265: 1102, 427: 2010, 2008}, + {2: 694, 694, 694, 694, 7: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 22: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 208: 694, 694, 211: 694, 694, 694, 694, 694, 694, 694, 236: 694, 240: 694, 247: 694, 694, 282: 694, 286: 694, 694, 694, 694, 694, 292: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2021}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2022}, + {21: 2023, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 670 + {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 207: 597, 597, 597, 597, 597, 597, 214: 597, 597, 597, 218: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 237: 597, 597, 597, 241: 597, 597, 597, 597, 597, 597, 249: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 283: 597, 597, 597, 346: 597}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2025}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2026}, + {21: 2027, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 207: 598, 598, 598, 598, 598, 598, 214: 598, 598, 598, 218: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 237: 598, 598, 598, 241: 598, 598, 598, 598, 598, 598, 249: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 283: 598, 598, 598, 346: 598}, + // 675 + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2029}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2031}, + {1088, 1088, 6: 1088, 21: 1088, 23: 1088, 223: 1088, 225: 2014, 2012, 2013, 2011, 2009, 231: 1088, 427: 2010, 2008}, + {6: 2032, 21: 753, 23: 753, 223: 2033, 466: 2034, 2035}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2049}, + // 680 + {362: 2040}, + {752, 752, 21: 752, 23: 752, 207: 752, 218: 752, 752, 752, 752, 752}, + {21: 595, 23: 2037, 751: 2036}, + {21: 2039}, + {208: 2038}, + // 685 + {21: 594}, + {599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 207: 599, 599, 599, 599, 599, 599, 214: 599, 599, 599, 218: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 237: 599, 599, 599, 241: 599, 599, 599, 599, 599, 599, 249: 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 283: 599, 599, 599, 346: 599}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2041, 534: 2043, 572: 2042}, + {756, 756, 6: 756, 21: 756, 23: 756, 207: 756, 218: 756, 756, 756, 756, 756, 756, 225: 2014, 2012, 2013, 2011, 2009, 235: 756, 249: 2048, 2047, 427: 2010, 2008, 637: 2046}, + {760, 760, 6: 2044, 21: 760, 23: 760, 207: 760, 218: 760, 760, 760, 760, 760}, + // 690 + {759, 759, 6: 759, 21: 759, 23: 759, 207: 759, 218: 759, 759, 759, 759, 759, 759, 235: 759}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2041, 534: 2045}, + {758, 758, 6: 758, 21: 758, 23: 758, 207: 758, 218: 758, 758, 758, 758, 758, 758, 235: 758}, + {757, 757, 6: 757, 21: 757, 23: 757, 207: 757, 218: 757, 757, 757, 757, 757, 757, 235: 757}, + {755, 755, 6: 755, 21: 755, 23: 755, 207: 755, 218: 755, 755, 755, 755, 755, 755, 235: 755}, + // 695 + {754, 754, 6: 754, 21: 754, 23: 754, 207: 754, 218: 754, 754, 754, 754, 754, 754, 235: 754}, + {1087, 1087, 6: 1087, 21: 1087, 23: 1087, 223: 1087, 225: 2014, 2012, 2013, 2011, 2009, 231: 1087, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 246: 2054, 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2051, 435: 2053, 460: 2000, 2001, 473: 2052}, + {21: 2060, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2058}, + // 700 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2056}, + {21: 2055}, + {600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 207: 600, 600, 600, 600, 600, 600, 214: 600, 600, 600, 218: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 237: 600, 600, 600, 241: 600, 600, 600, 600, 600, 600, 249: 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 283: 600, 600, 600, 346: 600}, + {21: 2057, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 207: 602, 602, 602, 602, 602, 602, 214: 602, 602, 602, 218: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 237: 602, 602, 602, 241: 602, 602, 602, 602, 602, 602, 249: 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 283: 602, 602, 602, 346: 602}, + // 705 + {6: 2032, 21: 2059}, + {603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 207: 603, 603, 603, 603, 603, 603, 214: 603, 603, 603, 218: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 237: 603, 603, 603, 241: 603, 603, 603, 603, 603, 603, 249: 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 283: 603, 603, 603, 346: 603}, + {601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 207: 601, 601, 601, 601, 601, 601, 214: 601, 601, 601, 218: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 237: 601, 601, 601, 241: 601, 601, 601, 601, 601, 601, 249: 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 283: 601, 601, 601, 346: 601}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2062, 435: 2063}, + {21: 2066, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 710 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2064}, + {21: 2065, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 207: 604, 604, 604, 604, 604, 604, 214: 604, 604, 604, 218: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 237: 604, 604, 604, 241: 604, 604, 604, 604, 604, 604, 249: 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 283: 604, 604, 604, 346: 604}, + {605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 207: 605, 605, 605, 605, 605, 605, 214: 605, 605, 605, 218: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 237: 605, 605, 605, 241: 605, 605, 605, 605, 605, 605, 249: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 283: 605, 605, 605, 346: 605}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2068, 435: 2069}, + // 715 + {21: 2072, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2070}, + {21: 2071, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 207: 606, 606, 606, 606, 606, 606, 214: 606, 606, 606, 218: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 237: 606, 606, 606, 241: 606, 606, 606, 606, 606, 606, 249: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 283: 606, 606, 606, 346: 606}, + {607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 207: 607, 607, 607, 607, 607, 607, 214: 607, 607, 607, 218: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 237: 607, 607, 607, 241: 607, 607, 607, 607, 607, 607, 249: 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 283: 607, 607, 607, 346: 607}, + // 720 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2074, 435: 2075}, + {21: 2078, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2076}, + {21: 2077, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 207: 608, 608, 608, 608, 608, 608, 214: 608, 608, 608, 218: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 237: 608, 608, 608, 241: 608, 608, 608, 608, 608, 608, 249: 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 283: 608, 608, 608, 346: 608}, + // 725 + {609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 207: 609, 609, 609, 609, 609, 609, 214: 609, 609, 609, 218: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 237: 609, 609, 609, 241: 609, 609, 609, 609, 609, 609, 249: 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 283: 609, 609, 609, 346: 609}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2080, 688: 2082, 732: 2083, 790: 2084, 2081}, + {21: 2092, 225: 2014, 2012, 2013, 2011, 2009, 2093, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 230: 2086, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2085}, + {2: 613, 613, 613, 613, 7: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 22: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 208: 613, 613, 211: 613, 613, 613, 613, 613, 613, 613, 230: 613, 236: 613, 240: 613, 247: 613, 613, 282: 613, 286: 613, 613, 613, 613, 613, 292: 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613}, + // 730 + {2: 612, 612, 612, 612, 7: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 22: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 208: 612, 612, 211: 612, 612, 612, 612, 612, 612, 612, 230: 612, 236: 612, 240: 612, 247: 612, 612, 282: 612, 286: 612, 612, 612, 612, 612, 292: 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612}, + {2: 611, 611, 611, 611, 7: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 22: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 208: 611, 611, 211: 611, 611, 611, 611, 611, 611, 611, 230: 611, 236: 611, 240: 611, 247: 611, 611, 282: 611, 286: 611, 611, 611, 611, 611, 292: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611}, + {225: 2014, 2012, 2013, 2011, 2009, 2089, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2087}, + {21: 2088, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 735 + {623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 207: 623, 623, 623, 623, 623, 623, 214: 623, 623, 623, 218: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 237: 623, 623, 623, 241: 623, 623, 623, 623, 623, 623, 249: 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 283: 623, 623, 623, 346: 623}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2090}, + {21: 2091, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 207: 622, 622, 622, 622, 622, 622, 214: 622, 622, 622, 218: 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 237: 622, 622, 622, 241: 622, 622, 622, 622, 622, 622, 249: 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 283: 622, 622, 622, 346: 622}, + {625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 207: 625, 625, 625, 625, 625, 625, 214: 625, 625, 625, 218: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 237: 625, 625, 625, 241: 625, 625, 625, 625, 625, 625, 249: 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 283: 625, 625, 625, 346: 625}, + // 740 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2094}, + {21: 2095, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 207: 624, 624, 624, 624, 624, 624, 214: 624, 624, 624, 218: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 237: 624, 624, 624, 241: 624, 624, 624, 624, 624, 624, 249: 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 283: 624, 624, 624, 346: 624}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2097}, + {6: 2098, 225: 2014, 2012, 2013, 2011, 2009, 2099, 427: 2010, 2008}, + // 745 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2105}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2100}, + {21: 2101, 221: 2102, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 207: 630, 630, 630, 630, 630, 630, 214: 630, 630, 630, 218: 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 237: 630, 630, 630, 241: 630, 630, 630, 630, 630, 630, 249: 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 283: 630, 630, 630, 346: 630}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2103}, + // 750 + {21: 2104, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 207: 628, 628, 628, 628, 628, 628, 214: 628, 628, 628, 218: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 237: 628, 628, 628, 241: 628, 628, 628, 628, 628, 628, 249: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 283: 628, 628, 628, 346: 628}, + {6: 2107, 21: 2106, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 207: 631, 631, 631, 631, 631, 631, 214: 631, 631, 631, 218: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 237: 631, 631, 631, 241: 631, 631, 631, 631, 631, 631, 249: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 283: 631, 631, 631, 346: 631}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2108}, + // 755 + {21: 2109, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 207: 629, 629, 629, 629, 629, 629, 214: 629, 629, 629, 218: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 237: 629, 629, 629, 241: 629, 629, 629, 629, 629, 629, 249: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 283: 629, 629, 629, 346: 629}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2111}, + {214: 2117, 2118, 2123, 246: 2119, 264: 2125, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 207: 391, 391, 391, 391, 391, 391, 214: 391, 391, 391, 218: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 237: 391, 391, 391, 241: 391, 391, 391, 391, 391, 391, 249: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 283: 391, 391, 391, 346: 391}, + // 760 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2165}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2164}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2163}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2162}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 2159, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2158}, + // 765 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 2135, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2134}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2133}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2132}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2131}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2130}, + // 770 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2129}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2128}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2126}, + {21: 2127, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 207: 632, 632, 632, 632, 632, 632, 214: 632, 632, 632, 218: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 237: 632, 632, 632, 241: 632, 632, 632, 632, 632, 632, 249: 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 283: 632, 632, 632, 346: 632}, + // 775 + {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 207: 738, 738, 738, 738, 738, 738, 214: 738, 738, 738, 218: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 237: 738, 738, 241: 738, 738, 738, 738, 738, 738, 249: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 283: 738, 738, 738}, + {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 207: 739, 739, 739, 739, 739, 739, 214: 739, 739, 739, 218: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 237: 739, 739, 241: 739, 739, 739, 739, 739, 739, 249: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 2124, 739, 739, 739, 739, 283: 739, 739, 739}, + {740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 207: 740, 740, 740, 740, 740, 740, 214: 740, 740, 740, 218: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 237: 740, 740, 241: 740, 740, 740, 740, 740, 740, 249: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 2124, 740, 740, 740, 740, 283: 740, 740, 740}, + {741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 207: 741, 741, 741, 741, 741, 741, 214: 741, 741, 741, 218: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 237: 741, 741, 241: 741, 741, 741, 741, 741, 741, 249: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 2124, 741, 741, 741, 741, 283: 741, 741, 741}, + {742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 207: 742, 742, 742, 742, 742, 742, 214: 742, 742, 742, 218: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 237: 742, 742, 241: 742, 742, 742, 742, 742, 742, 249: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 2124, 742, 742, 742, 742, 283: 742, 742, 742}, + // 780 + {743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 207: 743, 743, 743, 743, 743, 743, 214: 743, 743, 743, 218: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 237: 743, 743, 241: 743, 743, 743, 743, 743, 743, 249: 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 743, 2124, 743, 743, 743, 743, 283: 743, 743, 743}, + {746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 207: 746, 746, 746, 746, 746, 746, 214: 746, 746, 2123, 218: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 237: 746, 746, 241: 746, 746, 746, 746, 746, 2119, 249: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 2121, 746, 2120, 2124, 746, 2122, 746, 746, 283: 746, 746, 746}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2136}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2137}, + {744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 207: 744, 744, 744, 744, 744, 744, 214: 744, 744, 744, 218: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 237: 744, 744, 241: 744, 744, 744, 744, 744, 744, 249: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 283: 744, 744, 744}, + // 785 + {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 207: 589, 589, 589, 589, 589, 589, 214: 589, 589, 589, 218: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 237: 589, 589, 241: 589, 589, 589, 589, 589, 589, 249: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 283: 589, 589, 589}, + {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 207: 588, 588, 588, 588, 588, 588, 214: 588, 588, 588, 218: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 237: 588, 588, 241: 588, 588, 588, 588, 588, 588, 249: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 283: 588, 588, 588}, + {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 207: 587, 587, 587, 587, 587, 587, 214: 587, 587, 587, 218: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 237: 587, 587, 241: 587, 587, 587, 587, 587, 587, 249: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 283: 587, 587, 587}, + {586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 207: 586, 586, 586, 586, 586, 586, 214: 586, 586, 586, 218: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 237: 586, 586, 241: 586, 586, 586, 586, 586, 586, 249: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 283: 586, 586, 586}, + {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 207: 585, 585, 585, 585, 585, 585, 214: 585, 585, 585, 218: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 237: 585, 585, 241: 585, 585, 585, 585, 585, 585, 249: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 283: 585, 585, 585}, + // 790 + {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 207: 584, 584, 584, 584, 584, 584, 214: 584, 584, 584, 218: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 237: 584, 584, 241: 584, 584, 584, 584, 584, 584, 249: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 283: 584, 584, 584}, + {583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 207: 583, 583, 583, 583, 583, 583, 214: 583, 583, 583, 218: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 237: 583, 583, 241: 583, 583, 583, 583, 583, 583, 249: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 283: 583, 583, 583}, + {582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 207: 582, 582, 582, 582, 582, 582, 214: 582, 582, 582, 218: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 237: 582, 582, 241: 582, 582, 582, 582, 582, 582, 249: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 283: 582, 582, 582}, + {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 207: 581, 581, 581, 581, 581, 581, 214: 581, 581, 581, 218: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 237: 581, 581, 241: 581, 581, 581, 581, 581, 581, 249: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 283: 581, 581, 581}, + {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 207: 580, 580, 580, 580, 580, 580, 214: 580, 580, 580, 218: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 237: 580, 580, 241: 580, 580, 580, 580, 580, 580, 249: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 283: 580, 580, 580}, + // 795 + {579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 207: 579, 579, 579, 579, 579, 579, 214: 579, 579, 579, 218: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 237: 579, 579, 241: 579, 579, 579, 579, 579, 579, 249: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 283: 579, 579, 579}, + {578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 207: 578, 578, 578, 578, 578, 578, 214: 578, 578, 578, 218: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 237: 578, 578, 241: 578, 578, 578, 578, 578, 578, 249: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 283: 578, 578, 578}, + {577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 207: 577, 577, 577, 577, 577, 577, 214: 577, 577, 577, 218: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 237: 577, 577, 241: 577, 577, 577, 577, 577, 577, 249: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 283: 577, 577, 577}, + {576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 207: 576, 576, 576, 576, 576, 576, 214: 576, 576, 576, 218: 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 237: 576, 576, 241: 576, 576, 576, 576, 576, 576, 249: 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 283: 576, 576, 576}, + {575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 207: 575, 575, 575, 575, 575, 575, 214: 575, 575, 575, 218: 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 237: 575, 575, 241: 575, 575, 575, 575, 575, 575, 249: 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 283: 575, 575, 575}, + // 800 + {574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 207: 574, 574, 574, 574, 574, 574, 214: 574, 574, 574, 218: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 237: 574, 574, 241: 574, 574, 574, 574, 574, 574, 249: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 283: 574, 574, 574}, + {573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 207: 573, 573, 573, 573, 573, 573, 214: 573, 573, 573, 218: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 237: 573, 573, 241: 573, 573, 573, 573, 573, 573, 249: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 283: 573, 573, 573}, + {572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 207: 572, 572, 572, 572, 572, 572, 214: 572, 572, 572, 218: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 237: 572, 572, 241: 572, 572, 572, 572, 572, 572, 249: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 283: 572, 572, 572}, + {571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 207: 571, 571, 571, 571, 571, 571, 214: 571, 571, 571, 218: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 237: 571, 571, 241: 571, 571, 571, 571, 571, 571, 249: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 283: 571, 571, 571}, + {570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 207: 570, 570, 570, 570, 570, 570, 214: 570, 570, 570, 218: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 237: 570, 570, 241: 570, 570, 570, 570, 570, 570, 249: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 283: 570, 570, 570}, + // 805 + {747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 207: 747, 747, 747, 747, 747, 747, 214: 747, 747, 2123, 218: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 237: 747, 747, 241: 747, 747, 747, 747, 747, 2119, 249: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 2121, 747, 2120, 2124, 747, 2122, 747, 747, 283: 747, 747, 747}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2160}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2161}, + {745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 207: 745, 745, 745, 745, 745, 745, 214: 745, 745, 745, 218: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 237: 745, 745, 241: 745, 745, 745, 745, 745, 745, 249: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 283: 745, 745, 745}, + {748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 207: 748, 748, 748, 748, 748, 748, 214: 2117, 2118, 2123, 218: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 237: 748, 748, 241: 748, 748, 748, 748, 748, 2119, 249: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 2121, 748, 2120, 2124, 748, 2122, 748, 748, 283: 748, 748, 748}, + // 810 + {749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 207: 749, 749, 749, 749, 749, 749, 214: 2117, 2118, 2123, 218: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 237: 749, 749, 241: 749, 749, 749, 749, 749, 2119, 249: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 2121, 749, 2120, 2124, 749, 2122, 749, 749, 283: 749, 749, 749}, + {750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 207: 750, 750, 750, 750, 750, 750, 214: 2117, 2118, 2123, 218: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 237: 750, 750, 241: 750, 750, 750, 750, 750, 2119, 249: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 2121, 750, 2120, 2124, 750, 2122, 2115, 2116, 283: 750, 750, 750}, + {751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 207: 751, 751, 751, 751, 751, 751, 214: 2117, 2118, 2123, 218: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 237: 751, 751, 241: 751, 751, 751, 751, 751, 2119, 249: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 2121, 2114, 2120, 2124, 751, 2122, 2115, 2116, 283: 751, 751, 751}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 517: 2167}, + {230: 2168}, + // 815 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2169}, + {21: 2170, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 207: 634, 634, 634, 634, 634, 634, 214: 634, 634, 634, 218: 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 237: 634, 634, 634, 241: 634, 634, 634, 634, 634, 634, 249: 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 283: 634, 634, 634, 346: 634}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2172}, + {6: 2173, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 820 + {309: 2174}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2175}, + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2176}, + {21: 2177}, + {635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 207: 635, 635, 635, 635, 635, 635, 214: 635, 635, 635, 218: 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 237: 635, 635, 635, 241: 635, 635, 635, 635, 635, 635, 249: 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 283: 635, 635, 635, 346: 635}, + // 825 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2179}, + {6: 2180, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 2182, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2181}, + {21: 2186, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2183}, + // 830 + {35: 2146, 2142, 2141, 2138, 2140, 2144, 2145, 2139, 2143, 225: 2014, 2012, 2013, 2011, 2009, 252: 2156, 2153, 2155, 2154, 2150, 2152, 2151, 2148, 2149, 2147, 2157, 427: 2010, 2008, 517: 2184}, + {21: 2185}, + {636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 207: 636, 636, 636, 636, 636, 636, 214: 636, 636, 636, 218: 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 237: 636, 636, 636, 241: 636, 636, 636, 636, 636, 636, 249: 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 283: 636, 636, 636, 346: 636}, + {637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 207: 637, 637, 637, 637, 637, 637, 214: 637, 637, 637, 218: 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 237: 637, 637, 637, 241: 637, 637, 637, 637, 637, 637, 249: 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 283: 637, 637, 637, 346: 637}, + {21: 1082, 240: 2189, 606: 2188, 2190}, + // 835 + {21: 1081}, + {21: 1080}, + {21: 2191}, + {638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 207: 638, 638, 638, 638, 638, 638, 214: 638, 638, 638, 218: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 237: 638, 638, 638, 241: 638, 638, 638, 638, 638, 638, 249: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 283: 638, 638, 638, 346: 638}, + {21: 1082, 240: 2189, 606: 2188, 2193}, + // 840 + {21: 2194}, + {639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 207: 639, 639, 639, 639, 639, 639, 214: 639, 639, 639, 218: 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 237: 639, 639, 639, 241: 639, 639, 639, 639, 639, 639, 249: 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 283: 639, 639, 639, 346: 639}, + {208: 775}, + {208: 774}, + {208: 773}, + // 845 + {208: 2199}, + {244: 2200}, + {640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 207: 640, 640, 640, 640, 640, 640, 214: 640, 640, 640, 218: 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 237: 640, 640, 640, 241: 640, 640, 640, 640, 640, 640, 249: 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 283: 640, 640, 640, 346: 640}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2202}, + {6: 2203, 214: 2117, 2118, 2123, 246: 2119, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + // 850 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2204}, + {21: 2205, 214: 2117, 2118, 2123, 246: 2119, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + {642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 207: 642, 642, 642, 642, 642, 642, 214: 642, 642, 642, 218: 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 237: 642, 642, 642, 241: 642, 642, 642, 642, 642, 642, 249: 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 283: 642, 642, 642, 346: 642}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2208}, + {6: 2032, 21: 1083}, + // 855 + {21: 2209}, + {643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 207: 643, 643, 643, 643, 643, 643, 214: 643, 643, 643, 218: 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 237: 643, 643, 643, 241: 643, 643, 643, 643, 643, 643, 249: 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 283: 643, 643, 643, 346: 643}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2211}, + {6: 2032, 21: 2212, 231: 2213}, + {648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 207: 648, 648, 648, 648, 648, 648, 214: 648, 648, 648, 218: 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 237: 648, 648, 648, 241: 648, 648, 648, 648, 648, 648, 249: 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 283: 648, 648, 648, 346: 648}, + // 860 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 2214}, + {21: 2215}, + {647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 207: 647, 647, 647, 647, 647, 647, 214: 647, 647, 647, 218: 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 237: 647, 647, 647, 241: 647, 647, 647, 647, 647, 647, 249: 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 283: 647, 647, 647, 346: 647}, + {649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 207: 649, 649, 649, 649, 649, 649, 214: 649, 649, 649, 218: 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 237: 649, 649, 649, 241: 649, 649, 649, 649, 649, 649, 249: 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 283: 649, 649, 649, 346: 649}, + {21: 2218, 240: 2219}, + // 865 + {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 207: 591, 591, 591, 591, 591, 591, 214: 591, 591, 591, 218: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 237: 591, 591, 591, 241: 591, 591, 591, 591, 591, 591, 249: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 283: 591, 591, 591, 346: 591}, + {21: 2220}, + {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 207: 590, 590, 590, 590, 590, 590, 214: 590, 590, 590, 218: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 237: 590, 590, 590, 241: 590, 590, 590, 590, 590, 590, 249: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 283: 590, 590, 590, 346: 590}, + {21: 2222}, + {650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 207: 650, 650, 650, 650, 650, 650, 214: 650, 650, 650, 218: 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 237: 650, 650, 650, 241: 650, 650, 650, 650, 650, 650, 249: 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 283: 650, 650, 650, 346: 650}, + // 870 + {651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 207: 651, 651, 651, 651, 651, 651, 214: 651, 651, 651, 218: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 237: 651, 651, 651, 241: 651, 651, 651, 651, 651, 651, 249: 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 283: 651, 651, 651, 346: 651}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2225}, + {21: 2226}, + {652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 207: 652, 652, 652, 652, 652, 652, 214: 652, 652, 652, 218: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 237: 652, 652, 652, 241: 652, 652, 652, 652, 652, 652, 249: 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 283: 652, 652, 652, 346: 652}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2228}, + // 875 + {21: 2229}, + {653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 207: 653, 653, 653, 653, 653, 653, 214: 653, 653, 653, 218: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 237: 653, 653, 653, 241: 653, 653, 653, 653, 653, 653, 249: 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 283: 653, 653, 653, 346: 653}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 247: 1927, 348: 1926, 1459, 1460, 1458, 409: 2231}, + {21: 2232}, + {706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 207: 706, 706, 706, 706, 706, 706, 214: 706, 706, 706, 218: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 237: 706, 706, 706, 241: 706, 706, 706, 706, 706, 706, 249: 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, 283: 706, 706, 706, 346: 706}, + // 880 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 247: 1927, 348: 1926, 1459, 1460, 1458, 409: 2234}, + {21: 2235}, + {707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 207: 707, 707, 707, 707, 707, 707, 214: 707, 707, 707, 218: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 237: 707, 707, 707, 241: 707, 707, 707, 707, 707, 707, 249: 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 707, 283: 707, 707, 707, 346: 707}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2237}, + {6: 2238, 225: 2014, 2012, 2013, 2011, 2009, 231: 2239, 427: 2010, 2008}, + // 885 + {12: 2249, 50: 2246, 2245, 56: 2248, 61: 2251, 248: 2243, 290: 2244, 374: 2247, 430: 2250, 573: 2242}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 2240}, + {21: 2241}, + {708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 207: 708, 708, 708, 708, 708, 708, 214: 708, 708, 708, 218: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 237: 708, 708, 708, 241: 708, 708, 708, 708, 708, 708, 249: 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 283: 708, 708, 708, 346: 708}, + {21: 2285}, + // 890 + {21: 134, 206: 2257, 441: 2258, 453: 2284}, + {7: 134, 21: 134, 206: 2257, 248: 134, 353: 134, 441: 2258, 453: 2271}, + {21: 551}, + {21: 134, 206: 2257, 441: 2258, 453: 2270}, + {21: 127, 206: 2263, 441: 2264, 540: 2262, 552: 2265}, + // 895 + {21: 134, 206: 2257, 441: 2258, 453: 2256}, + {21: 175, 375: 2253, 2254, 635: 2255}, + {21: 175, 375: 2253, 2254, 635: 2252}, + {21: 545}, + {21: 546}, + // 900 + {21: 174}, + {21: 173}, + {21: 547}, + {21: 548}, + {240: 1448, 432: 2259, 443: 2260}, + // 905 + {133, 133, 133, 133, 133, 133, 133, 133, 12: 133, 21: 133, 207: 133, 209: 133, 133, 213: 133, 217: 133, 239: 133, 248: 133, 133, 133, 291: 133, 341: 133, 133, 133, 133, 133, 353: 133, 430: 133, 133}, + {1105, 1105, 1105, 1105, 6: 1105, 1105, 1105, 1105, 1105, 1105, 13: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 48: 1105, 206: 1105, 1105, 210: 1105, 213: 1105, 218: 1105, 1105, 1105, 1105, 231: 1105, 236: 1105, 239: 1105, 347: 1105, 352: 1105, 1105, 1105, 1105, 1105}, + {21: 2261}, + {135, 135, 135, 135, 135, 135, 135, 135, 12: 135, 21: 135, 207: 135, 209: 135, 135, 213: 135, 217: 135, 239: 135, 248: 135, 135, 135, 291: 135, 341: 135, 135, 135, 135, 135, 353: 135, 430: 135, 135}, + {21: 549}, + // 910 + {240: 1448, 432: 2259, 443: 2266}, + {126, 126, 126, 126, 126, 126, 126, 12: 126, 21: 126, 207: 126, 209: 126, 126, 213: 126, 217: 126, 291: 126, 341: 126, 126, 126, 126, 126, 430: 126, 126}, + {125, 125, 125, 125, 125, 125, 125, 12: 125, 21: 125, 207: 125, 209: 125, 125, 213: 125, 217: 125, 291: 125, 341: 125, 125, 125, 125, 125, 430: 125, 125}, + {6: 2267, 21: 2261}, + {240: 1448, 432: 2259, 443: 2268}, + // 915 + {21: 2269}, + {124, 124, 124, 124, 124, 124, 124, 12: 124, 21: 124, 207: 124, 209: 124, 124, 213: 124, 217: 124, 291: 124, 341: 124, 124, 124, 124, 124, 430: 124, 124}, + {21: 550}, + {7: 2276, 21: 121, 248: 2273, 353: 2275, 449: 2274, 493: 2272}, + {21: 552}, + // 920 + {118, 118, 118, 118, 118, 118, 118, 2276, 21: 118, 207: 118, 209: 118, 118, 213: 118, 217: 118, 239: 118, 291: 118, 341: 118, 118, 118, 118, 118, 353: 2275, 449: 2282, 551: 2281}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2278}, + {234: 2277}, + {115, 115, 115, 115, 115, 115, 7: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 22: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 208: 115, 224: 115, 232: 115, 245: 115, 248: 115}, + {116, 116, 116, 116, 116, 116, 7: 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 22: 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 208: 116, 224: 116, 232: 116, 245: 116, 248: 116}, + // 925 + {123, 123, 123, 123, 123, 123, 123, 21: 123, 207: 123, 209: 123, 123, 213: 123, 217: 123, 239: 123, 248: 2279, 291: 123, 341: 123, 123, 123, 123, 123, 749: 2280}, + {122, 122, 122, 122, 122, 122, 122, 21: 122, 207: 122, 209: 122, 122, 213: 122, 217: 122, 239: 122, 291: 122, 341: 122, 122, 122, 122, 122}, + {119, 119, 119, 119, 119, 119, 119, 21: 119, 207: 119, 209: 119, 119, 213: 119, 217: 119, 239: 119, 291: 119, 341: 119, 119, 119, 119, 119}, + {120, 120, 120, 120, 120, 120, 120, 21: 120, 207: 120, 209: 120, 120, 213: 120, 217: 120, 239: 120, 291: 120, 341: 120, 120, 120, 120, 120}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2283}, + // 930 + {117, 117, 117, 117, 117, 117, 117, 21: 117, 207: 117, 209: 117, 117, 213: 117, 217: 117, 239: 117, 291: 117, 341: 117, 117, 117, 117, 117}, + {21: 553}, + {709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 207: 709, 709, 709, 709, 709, 709, 214: 709, 709, 709, 218: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 237: 709, 709, 709, 241: 709, 709, 709, 709, 709, 709, 249: 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 283: 709, 709, 709, 346: 709}, + {225: 2014, 2012, 2013, 2011, 2009, 251: 559, 427: 2010, 2008}, + {251: 2290, 677: 2289, 807: 2288}, + // 935 + {44: 555, 251: 2290, 263: 2296, 677: 2295, 708: 2294}, + {44: 558, 251: 558, 263: 558}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2291}, + {225: 2014, 2012, 2013, 2011, 2009, 265: 2292, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2293}, + // 940 + {44: 556, 225: 2014, 2012, 2013, 2011, 2009, 251: 556, 263: 556, 427: 2010, 2008}, + {44: 2298}, + {44: 557, 251: 557, 263: 557}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2297}, + {44: 554, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 945 + {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 207: 710, 710, 710, 710, 710, 710, 214: 710, 710, 710, 218: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 237: 710, 710, 710, 241: 710, 710, 710, 710, 710, 710, 249: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 283: 710, 710, 710, 346: 710}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2300}, + {210: 2301, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {12: 2249, 50: 2246, 2245, 56: 2248, 61: 2251, 248: 2243, 290: 2244, 374: 2247, 430: 2250, 573: 2302}, + {21: 2303}, + // 950 + {711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 207: 711, 711, 711, 711, 711, 711, 214: 711, 711, 711, 218: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 237: 711, 711, 711, 241: 711, 711, 711, 711, 711, 711, 249: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 283: 711, 711, 711, 346: 711}, + {712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 207: 712, 712, 712, 712, 712, 712, 214: 712, 712, 712, 218: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 237: 712, 712, 2305, 241: 712, 712, 712, 712, 712, 712, 249: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 283: 712, 712, 712, 346: 712}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 2308}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2307, 1935, 1996, 1934}, + {719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 207: 719, 719, 719, 719, 719, 719, 214: 719, 719, 719, 218: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 237: 719, 719, 2305, 241: 719, 719, 719, 719, 719, 719, 249: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 283: 719, 719, 719, 346: 719}, + // 955 + {728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 207: 728, 728, 728, 728, 728, 728, 214: 728, 728, 728, 218: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 237: 728, 728, 728, 241: 728, 728, 728, 728, 728, 728, 249: 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 283: 728, 728, 728, 346: 728}, + {713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 207: 713, 713, 713, 713, 713, 713, 214: 713, 713, 713, 218: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 237: 713, 713, 713, 241: 713, 713, 713, 713, 713, 713, 249: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 283: 713, 713, 713, 346: 713}, + {206: 2313, 352: 1379, 437: 2311, 1380, 1381, 1382, 444: 1385, 1384, 2312}, + {21: 2317, 219: 430}, + {21: 2316}, + // 960 + {352: 1379, 437: 2314, 1380, 1381, 1382}, + {21: 2315}, + {219: 429}, + {440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 207: 440, 440, 440, 440, 440, 440, 214: 440, 440, 440, 218: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 237: 440, 440, 440, 241: 440, 440, 440, 440, 440, 440, 249: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 283: 440, 440, 440, 346: 440}, + {441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 207: 441, 441, 441, 441, 441, 441, 214: 441, 441, 441, 218: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 237: 441, 441, 441, 241: 441, 441, 441, 441, 441, 441, 249: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 283: 441, 441, 441, 346: 441}, + // 965 + {6: 1088, 21: 2326, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {6: 2323}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 2320, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 1379, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2318, 437: 2321, 1380, 1381, 1382, 444: 1385, 1384, 2312, 455: 2319}, + {21: 2322, 219: 430}, + {441, 441, 6: 441, 21: 441, 209: 441, 214: 441, 441, 441, 219: 429, 225: 441, 441, 441, 441, 441, 232: 441, 239: 441, 245: 441, 441, 264: 441, 266: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 283: 441, 441, 441, 346: 441}, + // 970 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2324}, + {6: 1087, 21: 2325, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 207: 715, 715, 715, 715, 715, 715, 214: 715, 715, 715, 218: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 237: 715, 715, 715, 241: 715, 715, 715, 715, 715, 715, 249: 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 715, 283: 715, 715, 715, 346: 715}, + {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 207: 716, 716, 716, 716, 716, 716, 214: 716, 716, 716, 218: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 237: 716, 716, 716, 241: 716, 716, 716, 716, 716, 716, 249: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 283: 716, 716, 716, 346: 716}, + {718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 207: 718, 718, 718, 718, 718, 718, 214: 718, 718, 718, 218: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 237: 718, 718, 2305, 241: 718, 718, 718, 718, 718, 718, 249: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 283: 718, 718, 718, 346: 718}, + // 975 + {720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 207: 720, 720, 720, 720, 720, 720, 214: 720, 720, 720, 218: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 237: 720, 720, 2305, 241: 720, 720, 720, 720, 720, 720, 249: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 283: 720, 720, 720, 346: 720}, + {721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 207: 721, 721, 721, 721, 721, 721, 214: 721, 721, 721, 218: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 237: 721, 721, 2305, 241: 721, 721, 721, 721, 721, 721, 249: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 283: 721, 721, 721, 346: 721}, + {722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 207: 722, 722, 722, 722, 722, 722, 214: 722, 722, 722, 218: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 237: 722, 722, 2305, 241: 722, 722, 722, 722, 722, 722, 249: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 283: 722, 722, 722, 346: 722}, + {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 207: 723, 723, 723, 723, 723, 723, 214: 723, 723, 723, 218: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 237: 723, 723, 2305, 241: 723, 723, 723, 723, 723, 723, 249: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 283: 723, 723, 723, 346: 723}, + {208: 2335}, + // 980 + {208: 2334}, + {704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 207: 704, 704, 704, 704, 704, 704, 214: 704, 704, 704, 218: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 237: 704, 704, 704, 241: 704, 704, 704, 704, 704, 704, 249: 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 704, 283: 704, 704, 704, 346: 704}, + {705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 207: 705, 705, 705, 705, 705, 705, 214: 705, 705, 705, 218: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 237: 705, 705, 705, 241: 705, 705, 705, 705, 705, 705, 249: 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 705, 283: 705, 705, 705, 346: 705}, + {247: 2337}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2338, 1459, 1460, 1458}, + // 985 + {734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 207: 734, 734, 734, 734, 734, 734, 214: 734, 734, 734, 218: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 237: 734, 734, 734, 241: 734, 734, 734, 734, 734, 734, 249: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 283: 734, 734, 734, 346: 734, 357: 734, 734}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2340, 1459, 1460, 1458}, + {735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 207: 735, 735, 735, 735, 735, 735, 214: 735, 735, 735, 218: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 237: 735, 735, 735, 241: 735, 735, 735, 735, 735, 735, 2341, 249: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 283: 735, 735, 735, 346: 735, 357: 735, 735}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2342, 1459, 1460, 1458}, + {733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 207: 733, 733, 733, 733, 733, 733, 214: 733, 733, 733, 218: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 237: 733, 733, 733, 241: 733, 733, 733, 733, 733, 733, 249: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 283: 733, 733, 733, 346: 733, 357: 733, 733}, + // 990 + {765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 207: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 237: 765, 765, 765, 241: 765, 765, 765, 765, 765, 765, 249: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 283: 765, 765, 765, 291: 765, 341: 765, 765, 765, 765, 765, 765}, + {761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 207: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 237: 761, 761, 761, 241: 761, 761, 761, 761, 761, 761, 249: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 283: 761, 761, 761, 291: 761, 341: 761, 761, 761, 761, 761, 761}, + {35: 2355, 2351, 2350, 2347, 2349, 2353, 2354, 2348, 2352, 668: 2346}, + {6: 2356}, + {6: 569}, + // 995 + {6: 568}, + {6: 567}, + {6: 566}, + {6: 565}, + {6: 564}, + // 1000 + {6: 563}, + {6: 562}, + {6: 561}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2357}, + {6: 2358, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 1005 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2359}, + {21: 2360, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 207: 626, 626, 626, 626, 626, 626, 214: 626, 626, 626, 218: 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 237: 626, 626, 626, 241: 626, 626, 626, 626, 626, 626, 249: 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 283: 626, 626, 626, 346: 626}, + {35: 2355, 2351, 2350, 2347, 2349, 2353, 2354, 2348, 2352, 668: 2362}, + {6: 2363}, + // 1010 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2364}, + {6: 2365, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2366}, + {21: 2367, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 207: 627, 627, 627, 627, 627, 627, 214: 627, 627, 627, 218: 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 237: 627, 627, 627, 241: 627, 627, 627, 627, 627, 627, 249: 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 283: 627, 627, 627, 346: 627}, + // 1015 + {50: 2371, 2370, 56: 2372, 96: 2373, 720: 2369}, + {6: 2374}, + {6: 621}, + {6: 620}, + {6: 619}, + // 1020 + {6: 618}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2375}, + {21: 2376, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 207: 633, 633, 633, 633, 633, 633, 214: 633, 633, 633, 218: 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 237: 633, 633, 633, 241: 633, 633, 633, 633, 633, 633, 249: 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 283: 633, 633, 633, 346: 633}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2378}, + // 1025 + {6: 2379}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2380}, + {6: 1087, 21: 2381, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 207: 714, 714, 714, 714, 714, 714, 214: 714, 714, 714, 218: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 237: 714, 714, 714, 241: 714, 714, 714, 714, 714, 714, 249: 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 283: 714, 714, 714, 346: 714}, + {644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 207: 644, 644, 644, 644, 644, 644, 214: 644, 644, 644, 218: 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 237: 644, 644, 644, 241: 644, 644, 644, 644, 644, 644, 249: 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 283: 644, 644, 644, 346: 644}, + // 1030 + {645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 207: 645, 645, 645, 645, 645, 645, 214: 645, 645, 645, 218: 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 237: 645, 645, 645, 241: 645, 645, 645, 645, 645, 645, 249: 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 283: 645, 645, 645, 346: 645}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2385}, + {21: 2386}, + {641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 207: 641, 641, 641, 641, 641, 641, 214: 641, 641, 641, 218: 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 237: 641, 641, 641, 241: 641, 641, 641, 641, 641, 641, 249: 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 283: 641, 641, 641, 346: 641}, + {646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 207: 646, 646, 646, 646, 646, 646, 214: 646, 646, 646, 218: 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 237: 646, 646, 646, 241: 646, 646, 646, 646, 646, 646, 249: 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 283: 646, 646, 646, 346: 646}, + // 1035 + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 236: 699, 240: 699, 247: 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 460: 2000, 2001, 473: 2003, 478: 2004, 487: 2005, 503: 2389}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2390}, + {21: 2391, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 207: 610, 610, 610, 610, 610, 610, 214: 610, 610, 610, 218: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 237: 610, 610, 610, 241: 610, 610, 610, 610, 610, 610, 249: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 283: 610, 610, 610, 346: 610}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1084, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 455: 2207, 508: 2393}, + // 1040 + {21: 2394}, + {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 207: 593, 593, 593, 593, 593, 593, 214: 593, 593, 593, 218: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 237: 593, 593, 593, 241: 593, 593, 593, 593, 593, 593, 249: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 283: 593, 593, 593, 346: 593}, + {2: 1066, 1066, 1066, 1066, 7: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 22: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 208: 1066, 211: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 236: 1066, 240: 1066, 247: 1066, 1066, 282: 1066, 286: 1066, 1066, 1066, 1066, 1066, 292: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066}, + {245: 2420, 264: 2419, 283: 2418, 2404, 2405, 648: 2421}, + {206: 1062}, + // 1045 + {2: 1060, 1060, 1060, 1060, 7: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 22: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 208: 1060, 211: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 236: 1060, 240: 1060, 247: 1060, 1060, 282: 1060, 286: 1060, 1060, 1060, 1060, 1060, 292: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060}, + {2: 1058, 1058, 1058, 1058, 7: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 22: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 208: 1058, 211: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 236: 1058, 240: 1058, 247: 1058, 1058, 282: 1058, 286: 1058, 1058, 1058, 1058, 1058, 292: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058}, + {206: 2414, 406: 2415}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 2411}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2407, 1935, 1996, 1934}, + // 1050 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2406, 1935, 1996, 1934}, + {2: 1047, 1047, 1047, 1047, 7: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 22: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 208: 1047, 211: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 236: 1047, 240: 1047, 247: 1047, 1047, 282: 1047, 286: 1047, 1047, 1047, 1047, 1047, 292: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047}, + {2: 1046, 1046, 1046, 1046, 7: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 22: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 208: 1046, 211: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 236: 1046, 240: 1046, 247: 1046, 1046, 282: 1046, 286: 1046, 1046, 1046, 1046, 1046, 292: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046}, + {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 207: 1049, 1049, 210: 1049, 1049, 1049, 218: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 237: 1049, 1049, 2305, 241: 1049, 1049, 1049, 1049, 249: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 265: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 346: 2306}, + {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 2409, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 207: 1045, 1045, 210: 1045, 1045, 1045, 218: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 237: 1045, 1045, 2305, 241: 1045, 1045, 1045, 1045, 249: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 265: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 346: 2306, 733: 2408}, + // 1055 + {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 207: 1050, 1050, 210: 1050, 1050, 1050, 218: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 237: 1050, 1050, 241: 1050, 1050, 1050, 1050, 249: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 265: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050}, + {208: 2410}, + {1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 207: 1044, 1044, 210: 1044, 1044, 1044, 218: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 237: 1044, 1044, 241: 1044, 1044, 1044, 1044, 249: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 265: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044}, + {214: 2117, 2118, 2123, 225: 2412, 246: 2119, 274: 2121, 2114, 2120, 2124, 2113, 2122, 2115, 2116}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 2413}, + // 1060 + {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 207: 1051, 1051, 210: 1051, 1051, 1051, 218: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 237: 1051, 1051, 241: 1051, 1051, 1051, 1051, 249: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 265: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 2320, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 1379, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2030, 437: 2311, 1380, 1381, 1382, 444: 1385, 1384, 2312, 455: 2416}, + {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 207: 1052, 1052, 210: 1052, 1052, 1052, 218: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 237: 1052, 1052, 241: 1052, 1052, 1052, 1052, 249: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 265: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052}, + {6: 2032, 21: 2417}, + {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 207: 1053, 1053, 210: 1053, 1053, 1053, 218: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 237: 1053, 1053, 241: 1053, 1053, 1053, 1053, 249: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 265: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053}, + // 1065 + {2: 1065, 1065, 1065, 1065, 7: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 22: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 208: 1065, 211: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 236: 1065, 240: 1065, 247: 1065, 1065, 282: 1065, 286: 1065, 1065, 1065, 1065, 1065, 292: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065}, + {206: 1061}, + {2: 1059, 1059, 1059, 1059, 7: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 22: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 208: 1059, 211: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 236: 1059, 240: 1059, 247: 1059, 1059, 282: 1059, 286: 1059, 1059, 1059, 1059, 1059, 292: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059}, + {2: 1057, 1057, 1057, 1057, 7: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 22: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 208: 1057, 211: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 236: 1057, 240: 1057, 247: 1057, 1057, 282: 1057, 286: 1057, 1057, 1057, 1057, 1057, 292: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057}, + {68: 2445, 217: 2446, 294: 2444, 2443}, + // 1070 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 2437, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 2438, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2436, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 2434, 435: 2439, 681: 2435}, + {2: 1074, 1074, 1074, 1074, 7: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 22: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 208: 1074, 211: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 236: 1074, 240: 1074, 247: 1074, 1074, 282: 1074, 286: 1074, 1074, 1074, 1074, 1074, 292: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 435: 1074}, + {2: 1073, 1073, 1073, 1073, 7: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 22: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 208: 1073, 211: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 236: 1073, 240: 1073, 247: 1073, 1073, 282: 1073, 286: 1073, 1073, 1073, 1073, 1073, 292: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 435: 1073}, + {2: 1072, 1072, 1072, 1072, 7: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 22: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 208: 1072, 211: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 236: 1072, 240: 1072, 247: 1072, 1072, 282: 1072, 286: 1072, 1072, 1072, 1072, 1072, 292: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 435: 1072}, + {2: 1071, 1071, 1071, 1071, 7: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 22: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 208: 1071, 211: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 236: 1071, 240: 1071, 247: 1071, 1071, 282: 1071, 286: 1071, 1071, 1071, 1071, 1071, 292: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 435: 1071}, + // 1075 + {2: 1070, 1070, 1070, 1070, 7: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 22: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 208: 1070, 211: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 236: 1070, 240: 1070, 247: 1070, 1070, 282: 1070, 286: 1070, 1070, 1070, 1070, 1070, 292: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 435: 1070}, + {2: 1069, 1069, 1069, 1069, 7: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 22: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 208: 1069, 211: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 236: 1069, 240: 1069, 247: 1069, 1069, 282: 1069, 286: 1069, 1069, 1069, 1069, 1069, 292: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 435: 1069}, + {2: 1068, 1068, 1068, 1068, 7: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 22: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 208: 1068, 211: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 236: 1068, 240: 1068, 247: 1068, 1068, 282: 1068, 286: 1068, 1068, 1068, 1068, 1068, 292: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 435: 1068}, + {2: 1067, 1067, 1067, 1067, 7: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 22: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 208: 1067, 211: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 236: 1067, 240: 1067, 247: 1067, 1067, 282: 1067, 286: 1067, 1067, 1067, 1067, 1067, 292: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 435: 1067}, + {68: 1064, 209: 2433, 217: 1064, 294: 1064, 1064}, + // 1080 + {68: 1063, 217: 1063, 294: 1063, 1063}, + {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 207: 1078, 1078, 210: 1078, 1078, 1078, 218: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 237: 1078, 1078, 241: 1078, 1078, 1078, 1078, 249: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 265: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078}, + {206: 2310, 406: 2442}, + {391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 207: 391, 391, 391, 391, 391, 391, 214: 391, 391, 391, 218: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 237: 391, 391, 391, 241: 391, 391, 391, 391, 391, 391, 249: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 283: 391, 391, 391, 346: 391, 532: 2440}, + {932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 1056, 932, 932, 932, 932, 932, 932, 214: 932, 932, 932, 218: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 237: 932, 932, 932, 241: 932, 932, 932, 932, 932, 932, 932, 249: 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 283: 932, 932, 932, 346: 932, 357: 932, 932}, + // 1085 + {931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 1055, 931, 931, 931, 931, 931, 931, 214: 931, 931, 931, 218: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 237: 931, 931, 931, 241: 931, 931, 931, 931, 931, 931, 931, 249: 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 931, 283: 931, 931, 931, 346: 931, 357: 931, 931}, + {206: 1054}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 2441}, + {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 207: 1076, 1076, 210: 1076, 1076, 1076, 218: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 237: 1076, 1076, 241: 1076, 1076, 1076, 1076, 249: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 265: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076}, + {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 207: 1077, 1077, 210: 1077, 1077, 1077, 218: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 237: 1077, 1077, 241: 1077, 1077, 1077, 1077, 249: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 265: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077}, + // 1090 + {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 207: 1098, 1098, 210: 1098, 1098, 1098, 218: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 233: 1098, 1098, 1098, 237: 1098, 1098, 241: 1098, 1098, 1098, 1098, 249: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 265: 1098}, + {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 207: 1097, 1097, 210: 1097, 1097, 1097, 218: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 233: 1097, 1097, 1097, 237: 1097, 1097, 241: 1097, 1097, 1097, 1097, 249: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 265: 1097}, + {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 207: 1096, 1096, 210: 1096, 1096, 1096, 218: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 233: 1096, 1096, 1096, 237: 1096, 1096, 241: 1096, 1096, 1096, 1096, 249: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 265: 1096}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 207: 1079, 1079, 210: 1079, 1079, 1079, 218: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 237: 1079, 1079, 241: 1079, 1079, 1079, 1079, 249: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 265: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079}, + {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 207: 1099, 1099, 210: 1099, 1099, 1099, 218: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 233: 1099, 1099, 1099, 237: 1099, 1099, 241: 1099, 1099, 1099, 1099, 249: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 265: 1099, 427: 2010, 2008}, + // 1095 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2449}, + {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 207: 1103, 1103, 210: 1103, 1103, 1103, 218: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 2014, 2012, 2013, 2011, 2009, 1103, 1103, 233: 1103, 1103, 1103, 237: 1103, 1103, 241: 1103, 1103, 1103, 1103, 249: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 265: 1103, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2456}, + {237: 475, 526: 2453, 638: 2452}, + {237: 2454}, + // 1100 + {237: 474}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2455}, + {480, 480, 6: 480, 21: 480, 207: 480, 211: 480, 480, 218: 480, 480, 480, 480, 480, 480, 480, 231: 480, 233: 480, 480, 480, 237: 480, 480, 241: 480, 480, 480, 480, 465: 1868, 471: 1867}, + {481, 481, 6: 481, 21: 481, 207: 481, 211: 481, 481, 218: 481, 481, 481, 481, 481, 481, 481, 231: 481, 233: 481, 481, 481, 237: 481, 481, 241: 481, 481, 481, 481, 465: 1868, 471: 1867}, + {237: 2458}, + // 1105 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2459}, + {207: 2460, 211: 1871, 1872, 231: 2461, 233: 1870, 237: 1873, 241: 1874, 1875, 1869, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2465}, + {206: 2462}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 2463}, + // 1110 + {6: 1730, 21: 2464}, + {482, 482, 6: 482, 21: 482, 207: 482, 211: 482, 482, 218: 482, 482, 482, 482, 482, 482, 482, 231: 482, 233: 482, 482, 482, 237: 482, 482, 241: 482, 482, 482, 482}, + {483, 483, 6: 483, 21: 483, 207: 483, 211: 483, 483, 218: 483, 483, 483, 483, 483, 483, 483, 2014, 2012, 2013, 2011, 2009, 231: 483, 233: 483, 483, 483, 237: 483, 483, 241: 483, 483, 483, 483, 427: 2010, 2008}, + {486, 486, 6: 486, 21: 486, 207: 2467, 211: 486, 486, 218: 486, 486, 486, 486, 486, 486, 486, 231: 2468, 233: 486, 486, 486, 237: 486, 486, 241: 486, 486, 486, 486, 465: 1868, 471: 1867}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2472}, + // 1115 + {206: 2469}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 2470}, + {6: 1730, 21: 2471}, + {484, 484, 6: 484, 21: 484, 207: 484, 211: 484, 484, 218: 484, 484, 484, 484, 484, 484, 484, 231: 484, 233: 484, 484, 484, 237: 484, 484, 241: 484, 484, 484, 484}, + {485, 485, 6: 485, 21: 485, 207: 485, 211: 485, 485, 218: 485, 485, 485, 485, 485, 485, 485, 2014, 2012, 2013, 2011, 2009, 231: 485, 233: 485, 485, 485, 237: 485, 485, 241: 485, 485, 485, 485, 427: 2010, 2008}, + // 1120 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 2475}, + {506, 506, 6: 506, 21: 506, 207: 506, 211: 506, 506, 218: 506, 506, 506, 506, 506, 506, 506, 231: 506, 233: 506, 506, 506, 237: 506, 506, 241: 506, 506, 506, 506}, + {514, 514, 6: 514, 21: 514, 207: 514, 218: 514, 514, 514, 514, 514, 514, 514, 234: 514, 514, 238: 514}, + {488, 488, 6: 488, 21: 488, 207: 488, 211: 488, 488, 218: 488, 488, 488, 488, 488, 488, 488, 231: 488, 233: 488, 488, 488, 237: 488, 488, 241: 488, 488, 488, 488, 347: 2480, 363: 2481, 2479, 545: 2483, 2482, 612: 2484, 2478}, + {504, 504, 6: 504, 21: 504, 207: 504, 211: 504, 504, 218: 504, 504, 504, 504, 504, 504, 504, 231: 504, 233: 504, 504, 504, 237: 504, 504, 241: 504, 504, 504, 504, 347: 504, 363: 504, 504}, + // 1125 + {509, 509, 6: 509, 21: 509, 207: 509, 211: 509, 509, 218: 509, 509, 509, 509, 509, 509, 509, 231: 509, 233: 509, 509, 509, 237: 509, 509, 241: 509, 509, 509, 509}, + {291: 2499, 359: 2500, 475: 2503}, + {291: 2499, 359: 2500, 475: 2502}, + {291: 2499, 359: 2500, 475: 2501}, + {206: 498, 221: 2486, 726: 2487}, + // 1130 + {490, 490, 6: 490, 21: 490, 207: 490, 211: 490, 490, 218: 490, 490, 490, 490, 490, 490, 490, 231: 490, 233: 490, 490, 490, 237: 490, 490, 241: 490, 490, 490, 490, 347: 490, 363: 490, 490}, + {487, 487, 6: 487, 21: 487, 207: 487, 211: 487, 487, 218: 487, 487, 487, 487, 487, 487, 487, 231: 487, 233: 487, 487, 487, 237: 487, 487, 241: 487, 487, 487, 487, 347: 2480, 363: 2481, 2479, 545: 2485, 2482}, + {489, 489, 6: 489, 21: 489, 207: 489, 211: 489, 489, 218: 489, 489, 489, 489, 489, 489, 489, 231: 489, 233: 489, 489, 489, 237: 489, 489, 241: 489, 489, 489, 489, 347: 489, 363: 489, 489}, + {223: 2495, 237: 2494, 2496}, + {206: 2488}, + // 1135 + {2: 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 493, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2490, 1459, 1460, 1458, 522: 2489}, + {6: 2492, 21: 2491}, + {492, 492, 6: 492, 21: 492, 218: 492}, + {494, 494, 6: 494, 21: 494, 207: 494, 211: 494, 494, 218: 494, 494, 494, 494, 494, 494, 494, 231: 494, 233: 494, 494, 494, 237: 494, 494, 241: 494, 494, 494, 494, 347: 494, 363: 494, 494}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2493, 1459, 1460, 1458}, + // 1140 + {491, 491, 6: 491, 21: 491, 218: 491}, + {206: 497}, + {362: 2498}, + {362: 2497}, + {206: 495}, + // 1145 + {206: 496}, + {2: 1315, 1315, 1315, 1315, 7: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 22: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 221: 1315, 231: 1315}, + {2: 1314, 1314, 1314, 1314, 7: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 22: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 221: 1314, 231: 1314}, + {206: 499, 221: 499}, + {206: 500, 221: 500}, + // 1150 + {206: 501, 221: 501}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 2505}, + {211: 1871, 1872, 233: 1870, 237: 1873, 241: 1874, 1875, 1869, 2506, 465: 1868, 471: 1867}, + {512, 512, 6: 512, 21: 512, 207: 512, 218: 512, 512, 512, 512, 512, 512, 512, 234: 512, 512, 238: 512}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2509, 533: 2510}, + // 1155 + {232: 2523}, + {1287, 1287, 6: 1287, 222: 1287, 1287, 1287}, + {104, 104, 6: 2511, 222: 104, 104, 2513, 484: 2514, 2512}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2522}, + {753, 753, 222: 753, 2033, 466: 2034, 2516}, + // 1160 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2515}, + {103, 103, 21: 103, 207: 103, 218: 103, 103, 103, 103, 103, 103, 235: 103, 238: 103}, + {105, 105, 21: 105, 207: 105, 218: 105, 105, 105, 105, 105, 105, 225: 2014, 2012, 2013, 2011, 2009, 235: 105, 238: 105, 427: 2010, 2008}, + {470, 470, 222: 2517, 619: 2518}, + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2519}, + // 1165 + {108, 108}, + {469, 469}, + {468, 468, 6: 468, 21: 468, 48: 468, 207: 468, 218: 468, 468, 468, 468}, + {467, 467, 6: 467, 21: 467, 48: 467, 207: 467, 218: 467, 467, 467, 467}, + {1286, 1286, 6: 1286, 222: 1286, 1286, 1286}, + // 1170 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2524}, + {1288, 1288, 6: 1288, 222: 1288, 1288, 1288, 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2509, 533: 2526}, + {104, 104, 6: 2511, 224: 2513, 484: 2514, 2527}, + {107, 107}, + // 1175 + {31: 2533, 2532, 2531, 2530, 481: 2549, 664: 2550}, + {31: 457, 457, 457, 457, 481: 457}, + {206: 2546}, + {206: 2543}, + {206: 2537}, + // 1180 + {206: 2534}, + {240: 1448, 432: 2535}, + {21: 2536}, + {31: 452, 452, 452, 452, 481: 452}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2538, 1459, 1460, 1458, 542: 2539}, + // 1185 + {6: 459, 21: 459}, + {6: 2540, 21: 2541}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2542, 1459, 1460, 1458}, + {31: 453, 453, 453, 453, 481: 453}, + {6: 458, 21: 458}, + // 1190 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2538, 1459, 1460, 1458, 542: 2544}, + {6: 2540, 21: 2545}, + {31: 454, 454, 454, 454, 481: 454}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2538, 1459, 1460, 1458, 542: 2547}, + {6: 2540, 21: 2548}, + // 1195 + {31: 455, 455, 455, 455, 481: 455}, + {2: 460, 460, 460, 460, 7: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 22: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 208: 460, 460, 211: 460, 460, 460, 460, 460, 460, 460, 230: 460, 233: 460, 236: 460, 240: 460, 246: 460, 460, 460, 282: 460, 286: 460, 460, 460, 460, 460, 292: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 347: 460, 435: 460, 447: 460, 450: 460, 460, 460, 460: 460, 460}, + {31: 456, 456, 456, 456, 481: 456}, + {2: 204, 204, 204, 204, 7: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 22: 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2553}, + // 1200 + {203, 203}, + {24: 2561, 2558, 45: 2560, 442: 2557, 665: 2562, 718: 2559}, + {24: 307, 307, 45: 307, 442: 307}, + {24: 306, 306, 45: 306, 442: 306}, + {1119, 1119, 1119, 1119, 1119, 1119, 7: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 22: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 218: 1119, 286: 1119}, + // 1205 + {1118, 1118, 1118, 1118, 1118, 1118, 7: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 22: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 218: 1118, 286: 1118}, + {312, 312}, + {311, 311}, + {310, 310}, + {305, 305, 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 305, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2564, 784: 2565}, + // 1210 + {538, 538, 6: 538, 218: 538, 230: 538, 366: 538, 538}, + {304, 304, 6: 2570, 218: 304}, + {303, 303, 218: 2567, 809: 2566}, + {309, 309}, + {369: 2568}, + // 1215 + {220: 2569}, + {302, 302}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2571}, + {537, 537, 6: 537, 218: 537, 230: 537, 537, 366: 537, 537}, + {323, 323, 224: 2622, 245: 2621, 516: 2646}, + // 1220 + {300: 2643, 442: 2642}, + {357, 357, 221: 2640}, + {24: 2639}, + {25: 2629, 27: 2630, 29: 2631, 63: 2628}, + {323, 323, 224: 2622, 245: 2621, 516: 2627}, + // 1225 + {323, 323, 224: 2622, 245: 2621, 516: 2626}, + {323, 323, 224: 2622, 245: 2621, 516: 2625}, + {323, 323, 224: 2622, 245: 2621, 516: 2620}, + {349, 349}, + {348, 348}, + // 1230 + {230: 347, 264: 347}, + {230: 346, 264: 346}, + {230: 345, 264: 345}, + {342, 342, 224: 342, 245: 342}, + {341, 341, 224: 341, 245: 341}, + // 1235 + {340, 340, 224: 340, 245: 340}, + {24: 2618}, + {230: 2603, 264: 2604, 462: 2613}, + {333, 333, 224: 333, 245: 333}, + {332, 332, 224: 332, 245: 332}, + // 1240 + {24: 2612, 58: 2611}, + {329, 329, 224: 329, 245: 329}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2610}, + {24: 2609}, + {24: 2608}, + // 1245 + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2605}, + {324, 324, 224: 324, 245: 324}, + {24: 319, 58: 319}, + {24: 318, 58: 318}, + {25: 316, 27: 316, 29: 316, 63: 316}, + // 1250 + {2: 344, 344, 344, 344, 7: 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 22: 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344}, + {2: 343, 343, 343, 343, 7: 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 22: 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343}, + {325, 325, 224: 325, 245: 325}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 2607}, + {314, 314, 224: 314, 245: 314}, + // 1255 + {326, 326, 224: 326, 245: 326}, + {327, 327, 224: 327, 245: 327}, + {328, 328, 224: 328, 245: 328}, + {331, 331, 224: 331, 245: 331}, + {330, 330, 224: 330, 245: 330}, + // 1260 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2614, 1459, 1460, 1458, 429: 2615}, + {540, 540, 224: 540, 230: 2603, 245: 540, 247: 1672, 264: 2604, 462: 2616}, + {337, 337, 224: 337, 245: 337}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2617, 1459, 1460, 1458}, + {336, 336, 224: 336, 245: 336}, + // 1265 + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2619}, + {338, 338, 224: 338, 245: 338}, + {350, 350}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 2112, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 2624, 1935, 1996, 1934}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2623}, + // 1270 + {321, 321, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {322, 322, 239: 2305, 346: 2306}, + {351, 351}, + {352, 352}, + {353, 353}, + // 1275 + {354, 354}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2638}, + {230: 2603, 264: 2604, 462: 2633, 655: 2636}, + {230: 2603, 264: 2604, 462: 2633, 655: 2632}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2635}, + // 1280 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2634}, + {313, 313, 224: 313, 230: 313, 245: 313, 264: 313}, + {334, 334, 224: 334, 245: 334}, + {315, 315, 224: 315, 230: 2603, 245: 315, 264: 2604, 462: 2606, 498: 2637}, + {335, 335, 224: 335, 245: 335}, + // 1285 + {339, 339, 224: 339, 245: 339}, + {355, 355}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2641}, + {356, 356}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2645}, + // 1290 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 2644}, + {358, 358}, + {359, 359}, + {360, 360}, + {78: 2681, 151: 2682}, + // 1295 + {359: 2668, 442: 2667}, + {359: 2664}, + {359: 2661}, + {442: 2659}, + {78: 2653}, + // 1300 + {87: 2654}, + {240: 1448, 432: 2656, 628: 2655}, + {372, 372, 6: 2657}, + {362, 362, 6: 362}, + {240: 1448, 432: 2658}, + // 1305 + {361, 361, 6: 361}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2660}, + {373, 373, 6: 2570}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2662}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2663, 1459, 1460, 1458}, + // 1310 + {375, 375}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2665}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2666, 1459, 1460, 1458}, + {376, 376}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2680}, + // 1315 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2669}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2670, 1459, 1460, 1458}, + {377, 377, 206: 2673, 610: 2672, 723: 2671}, + {374, 374, 6: 2678}, + {365, 365, 6: 365}, + // 1320 + {240: 1448, 432: 2674}, + {6: 2675}, + {240: 1448, 432: 2676}, + {21: 2677}, + {363, 363, 6: 363}, + // 1325 + {206: 2673, 610: 2679}, + {364, 364, 6: 364}, + {378, 378, 6: 2570}, + {381, 381, 87: 2692, 126: 2693}, + {142: 2684, 162: 2685, 678: 2683}, + // 1330 + {370, 370}, + {240: 1448, 432: 2691}, + {124: 2687, 240: 1448, 432: 2686, 435: 2688}, + {368, 368}, + {240: 1448, 432: 2690}, + // 1335 + {240: 1448, 432: 2689}, + {366, 366}, + {367, 367}, + {369, 369}, + {380, 380, 240: 1448, 432: 2696}, + // 1340 + {141: 2694}, + {240: 1448, 432: 2656, 628: 2695}, + {371, 371, 6: 2657}, + {379, 379}, + {2: 115, 115, 115, 115, 7: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 22: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 208: 115, 232: 993, 248: 115}, + // 1345 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 2769, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 966, 348: 2730, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 962, 348: 2766, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 232: 961, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2762}, + {221: 2752, 232: 2751}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 2749, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 954, 348: 2727, 1459, 1460, 1458}, + // 1350 + {52: 2735, 232: 940, 369: 2736, 530: 2734, 560: 2733}, + {427, 427, 6: 2723}, + {232: 2721}, + {232: 2715}, + {232: 2711, 532: 2712}, + // 1355 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 2710}, + {396, 396, 6: 396}, + {400, 400, 6: 400}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2714}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2713}, + // 1360 + {404, 404, 6: 404, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {405, 405, 6: 405, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2720}, + {784, 784, 6: 784, 21: 784, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {783, 783, 6: 783, 21: 783, 206: 2233}, + // 1365 + {412, 412, 6: 412}, + {411, 411, 6: 411}, + {406, 406, 6: 406}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2722}, + {410, 410, 6: 410}, + // 1370 + {2: 1540, 1463, 1464, 1496, 7: 2697, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 2699, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 2724, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 2725, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 2700, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 289: 2707, 304: 2706, 348: 2705, 1459, 1460, 1458, 353: 2275, 449: 2708, 676: 2726}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 966, 348: 2730, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 232: 954, 348: 2727, 1459, 1460, 1458}, + {395, 395, 6: 395}, + {232: 2728}, + // 1375 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2729}, + {408, 408, 6: 408}, + {232: 2731}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 2718, 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2719, 528: 2732}, + {409, 409, 6: 409}, + // 1380 + {422, 422, 6: 2747}, + {421, 421, 6: 421}, + {128: 2739}, + {138: 2738, 405: 2737}, + {418, 418, 6: 418}, + // 1385 + {417, 417, 6: 417}, + {144: 2741, 146: 2743, 369: 2742, 729: 2740}, + {419, 419, 6: 419}, + {369: 2746}, + {110: 2744, 165: 2745}, + // 1390 + {413, 413, 6: 413}, + {415, 415, 6: 415}, + {414, 414, 6: 414}, + {416, 416, 6: 416}, + {52: 2735, 369: 2736, 530: 2748}, + // 1395 + {420, 420, 6: 420}, + {52: 2735, 232: 940, 369: 2736, 530: 2734, 560: 2750}, + {423, 423, 6: 2747}, + {11: 2757, 208: 2756, 642: 2761}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2753}, + // 1400 + {232: 2754}, + {11: 2757, 208: 2756, 642: 2755}, + {425, 425}, + {384, 384}, + {206: 2758}, + // 1405 + {208: 1797, 520: 2759}, + {21: 2760}, + {383, 383}, + {426, 426}, + {403, 403, 6: 403, 239: 2763}, + // 1410 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 213: 2764, 348: 1691, 1459, 1460, 1458, 434: 2765}, + {402, 402, 6: 402}, + {401, 401, 6: 401}, + {232: 2767}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2768}, + // 1415 + {407, 407, 6: 407, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {52: 2735, 232: 940, 369: 2736, 530: 2734, 560: 2770}, + {424, 424, 6: 2747}, + {206: 697, 352: 697, 435: 2002, 460: 2000, 2001, 473: 2772, 478: 2773, 704: 2775, 793: 2774}, + {2: 700, 700, 700, 700, 7: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 22: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 208: 700, 700, 211: 700, 700, 700, 700, 700, 700, 700, 233: 700, 236: 700, 240: 700, 246: 700, 700, 700, 282: 700, 286: 700, 700, 700, 700, 700, 292: 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, 352: 700, 447: 700, 450: 700, 700, 700}, + // 1420 + {206: 696, 352: 696}, + {206: 2779, 352: 1379, 437: 2781, 2776, 2777, 2778, 444: 2780}, + {206: 428, 352: 428}, + {753, 753, 21: 753, 207: 753, 219: 753, 753, 753, 753, 2033, 230: 2804, 466: 2034, 2805, 605: 2803}, + {466, 466, 21: 466, 207: 466, 219: 466, 466, 466, 2785, 483: 2801}, + // 1425 + {753, 753, 21: 753, 207: 753, 219: 753, 753, 753, 753, 2033, 466: 2034, 2792}, + {352: 1379, 437: 2782, 1380, 1381, 1382}, + {219: 431}, + {219: 430}, + {21: 2783}, + // 1430 + {753, 753, 21: 753, 207: 753, 219: 429, 222: 753, 2033, 466: 2034, 2784}, + {466, 466, 21: 466, 207: 466, 222: 2785, 483: 2786}, + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2787}, + {433, 433, 21: 433, 207: 433}, + {465, 465, 6: 2788, 21: 465, 48: 2789, 207: 465, 218: 465, 465, 465, 465}, + // 1435 + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2791}, + {240: 1448, 299: 2521, 432: 2259, 443: 2520, 524: 2790}, + {463, 463, 21: 463, 207: 463, 218: 463, 463, 463, 463}, + {464, 464, 21: 464, 207: 464, 218: 464, 464, 464, 464}, + {466, 466, 21: 466, 207: 466, 219: 466, 466, 466, 2785, 483: 2793}, + // 1440 + {439, 439, 21: 439, 207: 439, 219: 439, 2796, 2795, 496: 2794}, + {434, 434, 21: 434, 207: 434, 219: 518}, + {448: 2800}, + {264: 2797}, + {148: 2798}, + // 1445 + {135: 2799}, + {437, 437, 21: 437, 207: 437, 218: 437, 437}, + {438, 438, 21: 438, 207: 438, 218: 438, 438}, + {439, 439, 21: 439, 207: 439, 219: 439, 2796, 2795, 496: 2802}, + {435, 435, 21: 435, 207: 435, 219: 519}, + // 1450 + {104, 104, 21: 104, 207: 104, 218: 104, 104, 104, 104, 104, 104, 2513, 484: 2514, 2820}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 1845, 500: 2810, 706: 2809, 786: 2808}, + {466, 466, 21: 466, 207: 466, 219: 466, 466, 466, 2785, 483: 2806}, + {439, 439, 21: 439, 207: 439, 219: 439, 2796, 2795, 496: 2807}, + {436, 436, 21: 436, 207: 436, 219: 520}, + // 1455 + {104, 104, 21: 104, 207: 104, 218: 104, 104, 104, 104, 104, 104, 2513, 235: 104, 238: 104, 484: 2514, 2811}, + {517, 517, 21: 517, 207: 517, 218: 517, 517, 517, 517, 517, 517, 517}, + {516, 516, 6: 2473, 21: 516, 207: 516, 218: 516, 516, 516, 516, 516, 516, 516, 235: 516, 238: 516}, + {443, 443, 21: 443, 207: 443, 218: 443, 443, 443, 443, 443, 443, 235: 443, 238: 2812, 722: 2814, 767: 2813}, + {362: 2818}, + // 1460 + {1029, 1029, 21: 1029, 207: 1029, 218: 1029, 1029, 1029, 1029, 1029, 1029, 235: 2815, 724: 2816}, + {442, 442, 21: 442, 207: 442, 218: 442, 442, 442, 442, 442, 442, 235: 442}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2817}, + {521, 521, 21: 521, 207: 521, 218: 521, 521, 521, 521, 521, 521}, + {1028, 1028, 21: 1028, 207: 1028, 218: 1028, 1028, 1028, 1028, 1028, 1028, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + // 1465 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2041, 534: 2043, 572: 2819}, + {1030, 1030, 6: 2044, 21: 1030, 207: 1030, 218: 1030, 1030, 1030, 1030, 1030, 1030, 235: 1030}, + {753, 753, 21: 753, 207: 753, 218: 753, 753, 753, 753, 753, 2033, 466: 2034, 2821}, + {522, 522, 21: 522, 207: 522, 218: 522, 522, 522, 522, 522}, + {466, 466, 21: 466, 207: 466, 218: 466, 466, 466, 466, 2785, 483: 2823}, + // 1470 + {439, 439, 21: 439, 207: 439, 218: 439, 439, 2796, 2795, 496: 2824}, + {518, 518, 21: 518, 207: 518, 218: 518, 518}, + {439, 439, 21: 439, 207: 439, 218: 439, 439, 2796, 2795, 496: 2826}, + {519, 519, 21: 519, 207: 519, 218: 519, 519}, + {466, 466, 21: 466, 207: 466, 218: 466, 466, 466, 466, 2785, 483: 2828}, + // 1475 + {439, 439, 21: 439, 207: 439, 218: 439, 439, 2796, 2795, 496: 2829}, + {520, 520, 21: 520, 207: 520, 218: 520, 520}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 246: 2842, 1927, 1944, 282: 1958, 286: 1951, 1973, 2844, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 2843, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2841, 601: 2845, 712: 2846, 766: 2847}, + {2: 699, 699, 699, 699, 7: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 22: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 208: 699, 699, 211: 699, 699, 699, 699, 699, 699, 699, 233: 699, 236: 699, 240: 699, 246: 699, 699, 699, 282: 699, 286: 699, 699, 699, 699, 699, 292: 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 699, 435: 2002, 447: 699, 450: 699, 699, 699, 460: 2000, 2001, 473: 2772, 478: 2004, 487: 2832}, + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 208: 544, 544, 211: 544, 544, 544, 544, 544, 544, 544, 233: 544, 236: 544, 240: 544, 246: 544, 544, 544, 282: 544, 286: 544, 544, 544, 544, 544, 292: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 447: 544, 450: 1841, 1840, 1839, 515: 2833}, + // 1480 + {2: 449, 449, 449, 449, 7: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 22: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 2835, 2836, 449, 449, 449, 449, 449, 449, 449, 208: 449, 449, 211: 449, 449, 449, 449, 449, 449, 449, 233: 449, 236: 449, 240: 449, 246: 449, 449, 449, 282: 449, 286: 449, 449, 449, 449, 449, 292: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 447: 449, 769: 2834}, + {2: 451, 451, 451, 451, 7: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 22: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 208: 451, 451, 211: 451, 451, 451, 451, 451, 451, 451, 233: 451, 236: 451, 240: 451, 246: 451, 451, 451, 282: 451, 286: 451, 451, 451, 451, 451, 292: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 447: 2838, 765: 2837}, + {2: 448, 448, 448, 448, 7: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 22: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 208: 448, 448, 211: 448, 448, 448, 448, 448, 448, 448, 233: 448, 236: 448, 240: 448, 246: 448, 448, 448, 282: 448, 286: 448, 448, 448, 448, 448, 292: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 447: 448}, + {2: 447, 447, 447, 447, 7: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 22: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 208: 447, 447, 211: 447, 447, 447, 447, 447, 447, 447, 233: 447, 236: 447, 240: 447, 246: 447, 447, 447, 282: 447, 286: 447, 447, 447, 447, 447, 292: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447: 447}, + {2: 446, 446, 446, 446, 7: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 22: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 208: 446, 446, 211: 446, 446, 446, 446, 446, 446, 446, 233: 2840, 236: 446, 240: 446, 246: 446, 446, 446, 282: 446, 286: 446, 446, 446, 446, 446, 292: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 770: 2839}, + // 1485 + {2: 450, 450, 450, 450, 7: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 22: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 208: 450, 450, 211: 450, 450, 450, 450, 450, 450, 450, 233: 450, 236: 450, 240: 450, 246: 450, 450, 450, 282: 450, 286: 450, 450, 450, 450, 450, 292: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450}, + {2: 462, 462, 462, 462, 7: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 22: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 208: 462, 462, 211: 462, 462, 462, 462, 462, 462, 462, 236: 462, 240: 462, 246: 462, 462, 462, 282: 462, 286: 462, 462, 462, 462, 462, 292: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462}, + {2: 445, 445, 445, 445, 7: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 22: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 208: 445, 445, 211: 445, 445, 445, 445, 445, 445, 445, 236: 445, 240: 445, 246: 445, 445, 445, 282: 445, 286: 445, 445, 445, 445, 445, 292: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445}, + {1038, 1038, 1540, 1463, 1464, 1496, 1038, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1038, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 1038, 2857, 210: 2856, 218: 1038, 1038, 1038, 1038, 1038, 1038, 225: 2014, 2012, 2013, 2011, 2009, 1038, 348: 2855, 1459, 1460, 1458, 427: 2010, 2008, 602: 2854, 2865}, + {1043, 1043, 6: 1043, 21: 1043, 207: 1043, 218: 1043, 1043, 1043, 1043, 1043, 1043, 230: 1043}, + // 1490 + {736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 207: 736, 736, 736, 736, 214: 736, 736, 736, 218: 736, 736, 736, 736, 736, 736, 225: 736, 736, 736, 736, 736, 736, 232: 736, 239: 736, 245: 736, 736, 2860, 264: 736, 266: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 283: 736, 736, 736, 346: 736, 357: 736, 736}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2850, 1459, 1460, 1458, 631: 2198, 2195, 2197, 2196}, + {1032, 1032, 6: 1032, 21: 1032, 207: 1032, 218: 1032, 1032, 1032, 1032, 1032, 1032, 230: 1032}, + {444, 444, 6: 2848, 21: 444, 207: 444, 218: 444, 444, 444, 444, 444, 444, 230: 444}, + {523, 523, 21: 523, 207: 523, 218: 523, 523, 523, 523, 523, 523, 230: 523}, + // 1495 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 246: 2842, 1927, 1944, 282: 1958, 286: 1951, 1973, 2844, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 2843, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2841, 601: 2849}, + {1031, 1031, 6: 1031, 21: 1031, 207: 1031, 218: 1031, 1031, 1031, 1031, 1031, 1031, 230: 1031}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2851}, + {225: 2014, 2012, 2013, 2011, 2009, 244: 2852, 427: 2010, 2008}, + {1038, 1038, 1540, 1463, 1464, 1496, 1038, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1038, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 1038, 2857, 210: 2856, 218: 1038, 1038, 1038, 1038, 1038, 1038, 230: 1038, 348: 2855, 1459, 1460, 1458, 602: 2854, 2853}, + // 1500 + {1039, 1039, 6: 1039, 21: 1039, 207: 1039, 218: 1039, 1039, 1039, 1039, 1039, 1039, 230: 1039}, + {1037, 1037, 6: 1037, 21: 1037, 207: 1037, 218: 1037, 1037, 1037, 1037, 1037, 1037, 230: 1037}, + {1036, 1036, 6: 1036, 21: 1036, 207: 1036, 218: 1036, 1036, 1036, 1036, 1036, 1036, 230: 1036}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 2859, 348: 2858, 1459, 1460, 1458}, + {1034, 1034, 6: 1034, 21: 1034, 207: 1034, 218: 1034, 1034, 1034, 1034, 1034, 1034, 230: 1034}, + // 1505 + {1035, 1035, 6: 1035, 21: 1035, 207: 1035, 218: 1035, 1035, 1035, 1035, 1035, 1035, 230: 1035}, + {1033, 1033, 6: 1033, 21: 1033, 207: 1033, 218: 1033, 1033, 1033, 1033, 1033, 1033, 230: 1033}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 2861, 348: 2862, 1459, 1460, 1458}, + {1042, 1042, 6: 1042, 21: 1042, 207: 1042, 218: 1042, 1042, 1042, 1042, 1042, 1042, 230: 1042}, + {735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 207: 735, 735, 735, 735, 214: 735, 735, 735, 218: 735, 735, 735, 735, 735, 735, 225: 735, 735, 735, 735, 735, 735, 232: 735, 239: 735, 245: 735, 735, 2863, 264: 735, 266: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 283: 735, 735, 735, 346: 735, 357: 735, 735}, + // 1510 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 246: 2864, 348: 2342, 1459, 1460, 1458}, + {1041, 1041, 6: 1041, 21: 1041, 207: 1041, 218: 1041, 1041, 1041, 1041, 1041, 1041, 230: 1041}, + {1040, 1040, 6: 1040, 21: 1040, 207: 1040, 218: 1040, 1040, 1040, 1040, 1040, 1040, 230: 1040}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2867, 1459, 1460, 1458}, + {527, 527}, + // 1515 + {531, 531, 231: 2869}, + {289: 2112, 407: 2871, 794: 2870}, + {530, 530, 6: 2872}, + {529, 529, 6: 529}, + {289: 2112, 407: 2873}, + // 1520 + {528, 528, 6: 528}, + {230: 2875}, + {208: 2877, 289: 2112, 407: 2878, 760: 2876}, + {534, 534}, + {533, 533}, + // 1525 + {532, 532}, + {2: 804, 804, 804, 804, 7: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 22: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 463: 2880, 615: 2881}, + {2: 803, 803, 803, 803, 7: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 22: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2882}, + {69: 2888, 206: 2883, 234: 2887, 292: 2889, 352: 1379, 437: 2885, 1380, 1381, 1382, 444: 1385, 1384, 2886, 563: 2884, 614: 2890}, + // 1530 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 1271, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 1379, 433: 1726, 437: 2910, 1380, 1381, 1382, 470: 1727, 574: 2909}, + {206: 2900, 557: 2899, 675: 2898}, + {796, 796, 207: 796, 219: 430}, + {795, 795, 207: 795}, + {781, 781, 1540, 1463, 1464, 1496, 781, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 207: 781, 348: 1725, 1459, 1460, 1458, 433: 2892, 576: 2893, 695: 2891}, + // 1535 + {206: 793}, + {206: 792}, + {776, 776}, + {794, 794, 6: 2896, 207: 794}, + {232: 2894}, + // 1540 + {780, 780, 6: 780, 207: 780}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2895}, + {782, 782, 6: 782, 207: 782, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2892, 576: 2897}, + {779, 779, 6: 779, 207: 779}, + // 1545 + {798, 798, 6: 2907, 207: 798}, + {791, 791, 6: 791, 207: 791}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 788, 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2903, 795: 2902, 2901}, + {21: 2906}, + {6: 2904, 21: 787}, + // 1550 + {6: 785, 21: 785}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 2717, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 2716, 489: 2905}, + {6: 786, 21: 786}, + {789, 789, 6: 789, 207: 789}, + {206: 2900, 557: 2908}, + // 1555 + {790, 790, 6: 790, 207: 790}, + {21: 2912}, + {21: 2911}, + {797, 797, 207: 797, 219: 429}, + {69: 2888, 206: 2915, 292: 2889, 352: 1379, 437: 2914, 1380, 1381, 1382, 444: 1385, 1384, 2916, 563: 2913}, + // 1560 + {206: 2900, 557: 2899, 675: 2919}, + {801, 801, 207: 801, 219: 430}, + {352: 1379, 437: 2917, 1380, 1381, 1382}, + {799, 799, 207: 799}, + {21: 2918}, + // 1565 + {800, 800, 207: 800, 219: 429}, + {802, 802, 6: 2907, 207: 802}, + {2: 1023, 1023, 1023, 1023, 7: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 22: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 347: 1843, 463: 1023, 521: 2921}, + {2: 804, 804, 804, 804, 7: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 22: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 463: 2880, 615: 2922}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2923}, + // 1570 + {69: 2888, 206: 2883, 234: 2887, 292: 2889, 352: 1379, 437: 2885, 1380, 1381, 1382, 444: 1385, 1384, 2886, 563: 2884, 614: 2924}, + {778, 778, 207: 2926, 747: 2925}, + {805, 805}, + {113: 2927}, + {291: 2928}, + // 1575 + {448: 2929}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2508, 519: 2509, 533: 2930}, + {777, 777, 6: 2511}, + {1110, 1110, 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 2945}, + {1108, 1108}, + // 1580 + {968, 968, 968, 968, 968, 968, 7: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 22: 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, 232: 2942, 247: 968}, + {206: 2313, 236: 1373, 287: 1372, 352: 1379, 437: 2935, 1380, 1381, 1382, 444: 1385, 1384, 2940, 448: 1438, 454: 1365, 488: 2936, 491: 2938, 494: 2939, 502: 2937, 539: 2941}, + {249, 249, 219: 430}, + {248, 248}, + {247, 247}, + // 1585 + {246, 246}, + {245, 245}, + {244, 244}, + {1106, 1106}, + {208: 2943}, + // 1590 + {206: 2313, 236: 1373, 287: 1372, 352: 1379, 437: 2935, 1380, 1381, 1382, 444: 1385, 1384, 2940, 448: 1438, 454: 1365, 488: 2936, 491: 2938, 494: 2939, 502: 2937, 539: 2944}, + {1107, 1107}, + {1109, 1109}, + {1114, 1114}, + {255, 255, 219: 430}, + // 1595 + {254, 254}, + {253, 253}, + {252, 252}, + {251, 251}, + {250, 250}, + // 1600 + {2: 1131, 1131, 1131, 1131, 7: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 22: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 286: 1131}, + {2: 1027, 1027, 1027, 1027, 7: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 22: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 286: 2980, 543: 2985}, + {2: 1027, 1027, 1027, 1027, 7: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 22: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 286: 2980, 543: 2979}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 286: 2972, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2971}, + {286: 2968}, + // 1605 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 286: 2962, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2963, 673: 2961}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2960}, + {1123, 1123}, + {1125, 1125, 6: 2966}, + {293: 2964}, + // 1610 + {386, 386, 6: 386}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2963, 673: 2965}, + {1124, 1124, 6: 2966}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 2967}, + {385, 385, 6: 385}, + // 1615 + {293: 2969}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2970}, + {1126, 1126, 6: 2570}, + {1122, 1122, 6: 2570, 366: 2977, 2976, 556: 2978}, + {293: 2973}, + // 1620 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2974}, + {1122, 1122, 6: 2570, 366: 2977, 2976, 556: 2975}, + {1127, 1127}, + {1121, 1121, 6: 1121}, + {1120, 1120, 6: 1120}, + // 1625 + {1128, 1128}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 2982, 1459, 1460, 1458}, + {293: 2981}, + {2: 1026, 1026, 1026, 1026, 7: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 22: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 208: 1026, 282: 1026}, + {207: 2983}, + // 1630 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2984}, + {1129, 1129}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 2986}, + {1130, 1130}, + {2: 544, 544, 544, 544, 7: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 22: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 230: 544, 347: 544, 450: 1841, 1840, 1839, 515: 2988}, + // 1635 + {2: 536, 536, 536, 536, 7: 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 22: 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 2990, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, 230: 536, 347: 536, 762: 2989}, + {2: 1023, 1023, 1023, 1023, 7: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 22: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 230: 1023, 347: 1843, 521: 2991}, + {2: 535, 535, 535, 535, 7: 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 22: 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 535, 230: 535, 347: 535}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 230: 2992, 348: 1662, 1459, 1460, 1458, 429: 2563, 468: 2993}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 2997, 468: 2998}, + // 1640 + {6: 2570, 230: 2994}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 1845, 500: 2995}, + {104, 104, 6: 2473, 224: 2513, 484: 2514, 2996}, + {1133, 1133}, + {488, 488, 6: 538, 222: 488, 488, 488, 231: 538, 347: 2480, 363: 2481, 2479, 545: 2483, 2482, 612: 2484, 3002}, + // 1645 + {6: 2570, 231: 2999}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1852, 288: 1848, 348: 1662, 1459, 1460, 1458, 429: 1851, 456: 1850, 1849, 1854, 480: 1845, 500: 3000}, + {104, 104, 6: 2473, 224: 2513, 484: 2514, 3001}, + {1132, 1132}, + {104, 104, 222: 104, 104, 2513, 484: 2514, 3003}, + // 1650 + {753, 753, 222: 753, 2033, 466: 2034, 3004}, + {470, 470, 222: 2517, 619: 3005}, + {1134, 1134}, + {1135, 1135, 6: 2032}, + {359: 3492}, + // 1655 + {359: 1209}, + {2: 1025, 1025, 1025, 1025, 7: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 22: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 286: 3014, 544: 3479}, + {2: 1025, 1025, 1025, 1025, 7: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 22: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 286: 3014, 544: 3055}, + {22: 1152, 28: 1152, 46: 3021, 361: 1152, 799: 3020}, + {236: 3019}, + // 1660 + {2: 1025, 1025, 1025, 1025, 7: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 22: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 208: 1025, 282: 1025, 286: 3014, 544: 3015}, + {209: 3017}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 3016}, + {100, 100, 6: 1786}, + {293: 3018}, + // 1665 + {2: 1024, 1024, 1024, 1024, 7: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 22: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 208: 1024, 282: 1024}, + {22: 1153, 28: 1153, 46: 1153, 361: 1153}, + {22: 1148, 28: 3027, 361: 1148, 801: 3026}, + {232: 3022}, + {134: 3024, 158: 3025, 166: 3023}, + // 1670 + {22: 1151, 28: 1151, 361: 1151}, + {22: 1150, 28: 1150, 361: 1150}, + {22: 1149, 28: 1149, 361: 1149}, + {22: 1146, 361: 3031, 804: 3030}, + {232: 3028}, + // 1675 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 3029}, + {22: 1147, 361: 1147}, + {22: 3035}, + {145: 3032}, + {28: 3033, 125: 3034}, + // 1680 + {22: 1145}, + {22: 1144}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3037, 803: 3036}, + {206: 3039, 210: 1142, 802: 3038}, + {206: 1143, 210: 1143}, + // 1685 + {210: 3045}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3041, 1459, 1460, 1458, 691: 3040}, + {6: 3043, 21: 3042}, + {6: 1140, 21: 1140}, + {210: 1141}, + // 1690 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3044, 1459, 1460, 1458}, + {6: 1139, 21: 1139}, + {352: 1379, 437: 3046, 1380, 1381, 1382}, + {1138, 1138, 218: 3048, 800: 3047}, + {1155, 1155}, + // 1695 + {53: 3050, 106: 3049}, + {343: 3053}, + {343: 3051}, + {525: 3052}, + {1136, 1136}, + // 1700 + {525: 3054}, + {1137, 1137}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3056}, + {235, 235, 235, 235, 7: 235, 235, 235, 235, 235, 13: 235, 235, 235, 235, 235, 235, 235, 235, 206: 3060, 210: 235, 213: 235, 236: 235, 239: 235, 245: 3059, 347: 235, 352: 235, 235, 235, 235, 235, 735: 3058, 782: 3057}, + {210, 210, 3326, 3325, 7: 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 206: 210, 210: 210, 213: 3322, 236: 210, 239: 1195, 347: 210, 352: 210, 1195, 210, 3339, 3338, 472: 3324, 495: 3336, 499: 3341, 559: 3340, 699: 3321}, + // 1705 + {1196, 1196}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3320}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 245: 3063, 291: 1302, 341: 1302, 1302, 3067, 348: 1725, 1459, 1460, 1458, 359: 1302, 372: 1302, 1302, 433: 3062, 477: 3065, 536: 3066, 3061, 3064, 662: 3068, 781: 3069}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 291: 1301, 341: 1301, 1301, 348: 3319, 1459, 1460, 1458, 359: 1301, 372: 1301, 1301, 661: 3318}, + {35: 3208, 50: 3205, 3204, 56: 3207, 61: 3192, 96: 3206, 101: 3182, 3176, 3175, 115: 3190, 136: 3184, 159: 3200, 234: 3191, 248: 3186, 290: 154, 374: 3177, 3173, 3167, 378: 3193, 381: 3174, 3196, 384: 3181, 3179, 3168, 3169, 3170, 3171, 3172, 3203, 3198, 3202, 3197, 3166, 3201, 3178, 3194, 3180, 3165, 3195, 3164, 3199, 3187, 685: 3163, 3188, 3160, 703: 3158, 716: 3161, 3162, 728: 3159, 742: 3183, 745: 3156, 778: 3157, 788: 3189, 792: 3155, 797: 3185}, + // 1710 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3153}, + {291: 2499, 341: 3076, 3079, 359: 2500, 372: 3080, 3077, 475: 3078, 697: 3081}, + {6: 240, 21: 240}, + {6: 239, 21: 239}, + {206: 3073}, + // 1715 + {6: 237, 21: 237}, + {6: 3070, 21: 3071}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 291: 1302, 341: 1302, 1302, 3067, 348: 1725, 1459, 1460, 1458, 359: 1302, 372: 1302, 1302, 433: 3062, 477: 3065, 536: 3066, 3061, 3064, 662: 3072}, + {234, 234, 234, 234, 7: 234, 234, 234, 234, 234, 13: 234, 234, 234, 234, 234, 234, 234, 234, 206: 234, 210: 234, 213: 234, 236: 234, 239: 234, 347: 234, 352: 234, 234, 234, 234, 234}, + {6: 236, 21: 236}, + // 1720 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3074}, + {21: 3075, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {6: 238, 21: 238}, + {291: 3146}, + {291: 2499, 359: 2500, 475: 3140}, + // 1725 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 231: 1021, 348: 3084, 1459, 1460, 1458, 511: 3134}, + {2: 1313, 1313, 1313, 1313, 7: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 22: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 231: 1313, 291: 2499, 359: 2500, 475: 3114, 731: 3115}, + {291: 3082}, + {241, 241, 6: 241, 21: 241}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 348: 3084, 1459, 1460, 1458, 511: 3083}, + // 1730 + {206: 3085}, + {206: 1020, 231: 1020}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3086}, + {6: 3092, 21: 3091}, + {6: 134, 21: 134, 206: 2257, 249: 134, 134, 441: 2258, 453: 3089}, + // 1735 + {6: 1207, 21: 1207}, + {6: 756, 21: 756, 249: 2048, 2047, 637: 3090}, + {6: 1208, 21: 1208}, + {344: 3095, 555: 3094}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3093}, + // 1740 + {6: 1206, 21: 1206}, + {1239, 1239, 6: 1239, 21: 1239}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3096}, + {206: 3097}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3098}, + // 1745 + {6: 3092, 21: 3099}, + {1237, 1237, 1237, 1237, 1237, 1237, 1237, 21: 1237, 207: 3101, 209: 1237, 1237, 213: 1237, 217: 1237, 291: 1237, 341: 1237, 1237, 1237, 1237, 1237, 746: 3100}, + {1235, 1235, 1235, 1235, 1235, 1235, 1235, 21: 1235, 207: 3111, 209: 1235, 1235, 213: 1235, 217: 1235, 291: 1235, 341: 1235, 1235, 1235, 1235, 1235, 748: 3110}, + {454: 3102}, + {89: 3107, 234: 3106, 366: 3105, 3104, 647: 3103}, + // 1750 + {1236, 1236, 1236, 1236, 1236, 1236, 1236, 21: 1236, 207: 1236, 209: 1236, 1236, 213: 1236, 217: 1236, 291: 1236, 341: 1236, 1236, 1236, 1236, 1236}, + {1233, 1233, 1233, 1233, 1233, 1233, 1233, 21: 1233, 207: 1233, 209: 1233, 1233, 213: 1233, 217: 1233, 291: 1233, 341: 1233, 1233, 1233, 1233, 1233}, + {1232, 1232, 1232, 1232, 1232, 1232, 1232, 21: 1232, 207: 1232, 209: 1232, 1232, 213: 1232, 217: 1232, 291: 1232, 341: 1232, 1232, 1232, 1232, 1232}, + {217: 3109}, + {99: 3108}, + // 1755 + {1230, 1230, 1230, 1230, 1230, 1230, 1230, 21: 1230, 207: 1230, 209: 1230, 1230, 213: 1230, 217: 1230, 291: 1230, 341: 1230, 1230, 1230, 1230, 1230}, + {1231, 1231, 1231, 1231, 1231, 1231, 1231, 21: 1231, 207: 1231, 209: 1231, 1231, 213: 1231, 217: 1231, 291: 1231, 341: 1231, 1231, 1231, 1231, 1231}, + {1238, 1238, 1238, 1238, 1238, 1238, 1238, 21: 1238, 207: 1238, 209: 1238, 1238, 213: 1238, 217: 1238, 291: 1238, 341: 1238, 1238, 1238, 1238, 1238}, + {448: 3112}, + {89: 3107, 234: 3106, 366: 3105, 3104, 647: 3113}, + // 1760 + {1234, 1234, 1234, 1234, 1234, 1234, 1234, 21: 1234, 207: 1234, 209: 1234, 1234, 213: 1234, 217: 1234, 291: 1234, 341: 1234, 1234, 1234, 1234, 1234}, + {2: 1312, 1312, 1312, 1312, 7: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 22: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 231: 1312}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 231: 1021, 348: 3084, 1459, 1460, 1458, 511: 3116}, + {206: 1012, 231: 3118, 464: 3119, 523: 3117}, + {206: 3122}, + // 1765 + {60: 3121, 104: 3120}, + {206: 1011, 1011}, + {1014, 1014, 1014, 6: 1014, 8: 1014, 21: 1014, 206: 1014, 1014, 220: 1014, 231: 1014}, + {1013, 1013, 1013, 6: 1013, 8: 1013, 21: 1013, 206: 1013, 1013, 220: 1013, 231: 1013}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3123}, + // 1770 + {6: 3092, 21: 3124}, + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3125}, + {1240, 1240, 3129, 6: 1240, 8: 3127, 21: 1240, 231: 3118, 464: 3128, 512: 3126}, + {1018, 1018, 1018, 6: 1018, 8: 1018, 21: 1018, 220: 1018, 231: 1018}, + {232: 3131, 240: 1117, 436: 3132}, + // 1775 + {1016, 1016, 1016, 6: 1016, 8: 1016, 21: 1016, 220: 1016, 231: 1016}, + {208: 3130}, + {1015, 1015, 1015, 6: 1015, 8: 1015, 21: 1015, 220: 1015, 231: 1015}, + {2: 1116, 1116, 1116, 1116, 7: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 22: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 208: 1116, 213: 1116, 240: 1116, 248: 1116}, + {240: 1448, 432: 2259, 443: 3133}, + // 1780 + {1017, 1017, 1017, 6: 1017, 8: 1017, 21: 1017, 220: 1017, 231: 1017}, + {206: 1012, 231: 3118, 464: 3119, 523: 3135}, + {206: 3136}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3137}, + {6: 3092, 21: 3138}, + // 1785 + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3139}, + {1241, 1241, 3129, 6: 1241, 8: 3127, 21: 1241, 231: 3118, 464: 3128, 512: 3126}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 348: 3084, 1459, 1460, 1458, 511: 3141}, + {206: 3142}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3143}, + // 1790 + {6: 3092, 21: 3144}, + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3145}, + {1242, 1242, 3129, 6: 1242, 8: 3127, 21: 1242, 231: 3118, 464: 3128, 512: 3126}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 1021, 231: 1021, 348: 3084, 1459, 1460, 1458, 511: 3147}, + {206: 1012, 231: 3118, 464: 3119, 523: 3148}, + // 1795 + {206: 3149}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3150}, + {6: 3092, 21: 3151}, + {1019, 1019, 1019, 6: 1019, 8: 1019, 21: 1019, 231: 1019, 513: 3152}, + {1243, 1243, 3129, 6: 1243, 8: 3127, 21: 1243, 231: 3118, 464: 3128, 512: 3126}, + // 1800 + {21: 3154}, + {1156, 1156}, + {1245, 1245, 3272, 3267, 1245, 1245, 1245, 21: 1245, 207: 3271, 209: 3265, 1252, 213: 3270, 217: 3266, 291: 1266, 341: 3264, 3269, 3273, 3095, 3276, 555: 3275, 575: 3277, 608: 3274, 644: 3268, 693: 3278, 3263}, + {196, 196, 196, 196, 196, 196, 196, 21: 196, 207: 196, 209: 196, 196, 213: 196, 217: 196, 291: 196, 341: 196, 196, 196, 196, 196}, + {195, 195, 195, 195, 195, 195, 195, 21: 195, 207: 195, 209: 195, 195, 213: 195, 217: 195, 291: 195, 341: 195, 195, 195, 195, 195}, + // 1805 + {194, 194, 194, 194, 194, 194, 194, 21: 194, 207: 194, 209: 194, 194, 213: 194, 217: 194, 291: 194, 341: 194, 194, 194, 194, 194}, + {134, 134, 134, 134, 134, 134, 134, 12: 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 430: 134, 134, 441: 2258, 453: 3261}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3260}, + {127, 127, 127, 127, 127, 127, 127, 12: 127, 21: 127, 206: 2263, 127, 209: 127, 127, 213: 127, 217: 127, 291: 127, 341: 127, 127, 127, 127, 127, 430: 127, 127, 441: 2264, 540: 3258, 552: 2265}, + {127, 127, 127, 127, 127, 127, 127, 12: 127, 21: 127, 206: 2263, 127, 209: 127, 127, 213: 127, 217: 127, 291: 127, 341: 127, 127, 127, 127, 127, 430: 127, 127, 441: 2264, 540: 3256, 552: 2265}, + // 1810 + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3255}, + {188, 188, 188, 188, 188, 188, 188, 12: 188, 21: 188, 206: 188, 188, 209: 188, 188, 213: 188, 217: 188, 291: 188, 341: 188, 188, 188, 188, 188, 430: 188, 188}, + {187, 187, 187, 187, 187, 187, 187, 12: 187, 21: 187, 206: 187, 187, 209: 187, 187, 213: 187, 217: 187, 291: 187, 341: 187, 187, 187, 187, 187, 430: 187, 187}, + {186, 186, 186, 186, 186, 186, 186, 12: 186, 21: 186, 206: 186, 186, 209: 186, 186, 213: 186, 217: 186, 291: 186, 341: 186, 186, 186, 186, 186, 430: 186, 186}, + {185, 185, 185, 185, 185, 185, 185, 12: 185, 21: 185, 206: 185, 185, 209: 185, 185, 213: 185, 217: 185, 291: 185, 341: 185, 185, 185, 185, 185, 430: 185, 185}, + // 1815 + {184, 184, 184, 184, 184, 184, 184, 12: 184, 21: 184, 206: 184, 184, 209: 184, 184, 213: 184, 217: 184, 291: 184, 341: 184, 184, 184, 184, 184, 430: 184, 184}, + {183, 183, 183, 183, 183, 183, 183, 12: 183, 21: 183, 206: 183, 183, 209: 183, 183, 213: 183, 217: 183, 291: 183, 341: 183, 183, 183, 183, 183, 430: 183, 183}, + {182, 182, 182, 182, 182, 182, 182, 12: 182, 21: 182, 206: 182, 182, 209: 182, 182, 213: 182, 217: 182, 291: 182, 341: 182, 182, 182, 182, 182, 430: 182, 182}, + {181, 181, 181, 181, 181, 181, 181, 12: 181, 21: 181, 206: 181, 181, 209: 181, 181, 213: 181, 217: 181, 291: 181, 341: 181, 181, 181, 181, 181, 430: 181, 181}, + {180, 180, 180, 180, 180, 180, 180, 12: 180, 21: 180, 206: 180, 180, 209: 180, 180, 213: 180, 217: 180, 291: 180, 341: 180, 180, 180, 180, 180, 430: 180, 180}, + // 1820 + {179, 179, 179, 179, 179, 179, 179, 12: 179, 21: 179, 206: 179, 179, 209: 179, 179, 213: 179, 217: 179, 291: 179, 341: 179, 179, 179, 179, 179, 430: 179, 179}, + {178, 178, 178, 178, 178, 178, 178, 12: 178, 21: 178, 206: 178, 178, 209: 178, 178, 213: 178, 217: 178, 291: 178, 341: 178, 178, 178, 178, 178, 430: 178, 178}, + {177, 177, 177, 177, 177, 177, 177, 12: 177, 21: 177, 207: 177, 209: 177, 177, 213: 177, 217: 177, 291: 177, 341: 177, 177, 177, 177, 177, 430: 177, 177}, + {176, 176, 176, 176, 176, 176, 176, 12: 176, 21: 176, 207: 176, 209: 176, 176, 213: 176, 217: 176, 291: 176, 341: 176, 176, 176, 176, 176, 430: 176, 176}, + {172, 172, 172, 172, 172, 172, 172, 12: 172, 21: 172, 206: 172, 172, 209: 172, 172, 213: 172, 217: 172, 291: 172, 341: 172, 172, 172, 172, 172, 430: 172, 172}, + // 1825 + {171, 171, 171, 171, 171, 171, 171, 12: 171, 21: 171, 206: 171, 171, 209: 171, 171, 213: 171, 217: 171, 291: 171, 341: 171, 171, 171, 171, 171, 430: 171, 171}, + {170, 170, 170, 170, 170, 170, 170, 12: 170, 21: 170, 206: 170, 170, 209: 170, 170, 213: 170, 217: 170, 291: 170, 341: 170, 170, 170, 170, 170, 430: 170, 170}, + {169, 169, 169, 169, 169, 169, 169, 12: 169, 21: 169, 206: 169, 169, 209: 169, 169, 213: 169, 217: 169, 291: 169, 341: 169, 169, 169, 169, 169, 430: 169, 169}, + {168, 168, 168, 168, 168, 168, 168, 12: 168, 21: 168, 206: 168, 168, 209: 168, 168, 213: 168, 217: 168, 291: 168, 341: 168, 168, 168, 168, 168, 430: 168, 168, 759: 3254}, + {166, 166, 166, 166, 166, 166, 166, 21: 166, 206: 166, 166, 209: 166, 166, 213: 166, 217: 166, 291: 166, 341: 166, 166, 166, 166, 166}, + // 1830 + {290: 3248}, + {290: 153, 353: 3243, 378: 3244}, + {206: 2257, 441: 3240}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3239}, + {206: 2257, 441: 3238}, + // 1835 + {159, 159, 159, 159, 159, 159, 159, 21: 159, 207: 159, 209: 159, 159, 213: 159, 217: 159, 291: 159, 341: 159, 159, 159, 159, 159}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3236}, + {206: 3231}, + {206: 3221}, + {155, 155, 155, 155, 155, 155, 155, 21: 155, 207: 155, 209: 155, 155, 213: 155, 217: 155, 291: 155, 341: 155, 155, 155, 155, 155}, + // 1840 + {206: 151}, + {206: 150}, + {149, 149, 149, 149, 149, 149, 149, 21: 149, 207: 149, 209: 149, 149, 213: 149, 217: 149, 291: 149, 341: 149, 149, 149, 149, 149}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3220}, + {147, 147, 147, 147, 147, 147, 147, 21: 147, 207: 147, 209: 147, 147, 213: 147, 217: 147, 291: 147, 341: 147, 147, 147, 147, 147}, + // 1845 + {146, 146, 146, 146, 146, 146, 146, 21: 146, 207: 146, 209: 146, 146, 213: 146, 217: 146, 291: 146, 341: 146, 146, 146, 146, 146}, + {145, 145, 145, 145, 145, 145, 145, 145, 21: 145, 207: 145, 209: 145, 145, 213: 145, 217: 145, 239: 145, 248: 145, 291: 145, 341: 145, 145, 145, 145, 145, 353: 145}, + {134, 134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 239: 134, 248: 134, 291: 134, 341: 134, 134, 134, 134, 134, 353: 134, 441: 2258, 453: 3219}, + {143, 143, 143, 143, 143, 143, 143, 143, 21: 143, 207: 143, 209: 143, 143, 213: 143, 217: 143, 239: 143, 248: 143, 291: 143, 341: 143, 143, 143, 143, 143, 353: 143}, + {142, 142, 142, 142, 142, 142, 142, 142, 21: 142, 207: 142, 209: 142, 142, 213: 142, 217: 142, 239: 142, 248: 142, 291: 142, 341: 142, 142, 142, 142, 142, 353: 142}, + // 1850 + {378: 3218}, + {140, 140, 140, 140, 140, 140, 140, 21: 140, 207: 140, 209: 140, 140, 213: 140, 217: 140, 291: 140, 341: 140, 140, 140, 140, 140}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3217}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3216}, + {134, 134, 134, 134, 134, 134, 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 441: 2258, 453: 3215}, + // 1855 + {134, 134, 134, 134, 134, 134, 134, 12: 134, 21: 134, 206: 2257, 134, 209: 134, 134, 213: 134, 217: 134, 291: 134, 341: 134, 134, 134, 134, 134, 430: 134, 134, 441: 2258, 453: 3209}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3210}, + {136, 136, 136, 136, 136, 136, 136, 12: 3212, 21: 136, 207: 136, 209: 136, 136, 213: 136, 217: 136, 291: 136, 341: 136, 136, 136, 136, 136, 430: 3211, 3213, 509: 3214}, + {132, 132, 132, 132, 132, 132, 132, 12: 132, 21: 132, 207: 132, 209: 132, 132, 213: 132, 217: 132, 291: 132, 341: 132, 132, 132, 132, 132, 430: 132, 132}, + {131, 131, 131, 131, 131, 131, 131, 12: 131, 21: 131, 207: 131, 209: 131, 131, 213: 131, 217: 131, 291: 131, 341: 131, 131, 131, 131, 131, 430: 131, 131}, + // 1860 + {130, 130, 130, 130, 130, 130, 130, 12: 130, 21: 130, 207: 130, 209: 130, 130, 213: 130, 217: 130, 291: 130, 341: 130, 130, 130, 130, 130, 430: 130, 130}, + {128, 128, 128, 128, 128, 128, 128, 12: 128, 21: 128, 207: 128, 209: 128, 128, 213: 128, 217: 128, 291: 128, 341: 128, 128, 128, 128, 128, 430: 128, 128}, + {137, 137, 137, 137, 137, 137, 137, 21: 137, 207: 137, 209: 137, 137, 213: 137, 217: 137, 291: 137, 341: 137, 137, 137, 137, 137}, + {138, 138, 138, 138, 138, 138, 138, 21: 138, 207: 138, 209: 138, 138, 213: 138, 217: 138, 291: 138, 341: 138, 138, 138, 138, 138}, + {139, 139, 139, 139, 139, 139, 139, 21: 139, 207: 139, 209: 139, 139, 213: 139, 217: 139, 291: 139, 341: 139, 139, 139, 139, 139}, + // 1865 + {141, 141, 141, 141, 141, 141, 141, 141, 21: 141, 207: 141, 209: 141, 141, 213: 141, 217: 141, 239: 141, 248: 141, 291: 141, 341: 141, 141, 141, 141, 141, 353: 141}, + {144, 144, 144, 144, 144, 144, 144, 144, 21: 144, 207: 144, 209: 144, 144, 213: 144, 217: 144, 239: 144, 248: 144, 291: 144, 341: 144, 144, 144, 144, 144, 353: 144}, + {148, 148, 148, 148, 148, 148, 148, 21: 148, 207: 148, 209: 148, 148, 213: 148, 217: 148, 291: 148, 341: 148, 148, 148, 148, 148}, + {208: 3223, 659: 3222}, + {6: 3225, 21: 3224}, + // 1870 + {6: 112, 21: 112}, + {118, 118, 118, 118, 118, 118, 118, 2276, 21: 118, 207: 118, 209: 118, 118, 213: 118, 217: 118, 239: 118, 291: 118, 341: 118, 118, 118, 118, 118, 353: 2275, 449: 2282, 551: 3227}, + {208: 3226}, + {6: 111, 21: 111}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3228}, + // 1875 + {156, 156, 156, 156, 156, 156, 156, 21: 156, 207: 156, 209: 156, 156, 213: 156, 217: 156, 291: 156, 341: 156, 156, 156, 156, 156}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3230}, + {113, 113, 113, 113, 113, 113, 113, 21: 113, 207: 113, 209: 113, 113, 213: 113, 217: 113, 291: 113, 341: 113, 113, 113, 113, 113}, + {208: 3223, 659: 3232}, + {6: 3225, 21: 3233}, + // 1880 + {118, 118, 118, 118, 118, 118, 118, 2276, 21: 118, 207: 118, 209: 118, 118, 213: 118, 217: 118, 239: 118, 291: 118, 341: 118, 118, 118, 118, 118, 353: 2275, 449: 2282, 551: 3234}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3235}, + {157, 157, 157, 157, 157, 157, 157, 21: 157, 207: 157, 209: 157, 157, 213: 157, 217: 157, 291: 157, 341: 157, 157, 157, 157, 157}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3237}, + {158, 158, 158, 158, 158, 158, 158, 21: 158, 207: 158, 209: 158, 158, 213: 158, 217: 158, 291: 158, 341: 158, 158, 158, 158, 158}, + // 1885 + {160, 160, 160, 160, 160, 160, 160, 21: 160, 207: 160, 209: 160, 160, 213: 160, 217: 160, 291: 160, 341: 160, 160, 160, 160, 160}, + {161, 161, 161, 161, 161, 161, 161, 21: 161, 207: 161, 209: 161, 161, 213: 161, 217: 161, 291: 161, 341: 161, 161, 161, 161, 161}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3241}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3242}, + {162, 162, 162, 162, 162, 162, 162, 21: 162, 207: 162, 209: 162, 162, 213: 162, 217: 162, 291: 162, 341: 162, 162, 162, 162, 162}, + // 1890 + {206: 2257, 441: 3245}, + {206: 152}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3246}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3247}, + {163, 163, 163, 163, 163, 163, 163, 21: 163, 207: 163, 209: 163, 163, 213: 163, 217: 163, 291: 163, 341: 163, 163, 163, 163, 163}, + // 1895 + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 206: 2257, 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 441: 3249, 449: 2274, 493: 3250}, + {121, 121, 121, 121, 121, 121, 121, 2276, 21: 121, 207: 121, 209: 121, 121, 213: 121, 217: 121, 239: 121, 248: 2273, 291: 121, 341: 121, 121, 121, 121, 121, 353: 2275, 449: 2274, 493: 3252}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3251}, + {164, 164, 164, 164, 164, 164, 164, 21: 164, 207: 164, 209: 164, 164, 213: 164, 217: 164, 291: 164, 341: 164, 164, 164, 164, 164}, + {114, 114, 114, 114, 114, 114, 114, 21: 114, 207: 114, 209: 114, 114, 213: 114, 217: 114, 239: 3229, 291: 114, 341: 114, 114, 114, 114, 114, 476: 3253}, + // 1900 + {165, 165, 165, 165, 165, 165, 165, 21: 165, 207: 165, 209: 165, 165, 213: 165, 217: 165, 291: 165, 341: 165, 165, 165, 165, 165}, + {167, 167, 167, 167, 167, 167, 167, 12: 167, 21: 167, 206: 167, 167, 209: 167, 167, 213: 167, 217: 167, 291: 167, 341: 167, 167, 167, 167, 167, 430: 167, 167}, + {189, 189, 189, 189, 189, 189, 189, 21: 189, 207: 189, 209: 189, 189, 213: 189, 217: 189, 291: 189, 341: 189, 189, 189, 189, 189}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3257}, + {190, 190, 190, 190, 190, 190, 190, 12: 3212, 21: 190, 207: 190, 209: 190, 190, 213: 190, 217: 190, 291: 190, 341: 190, 190, 190, 190, 190, 430: 3211, 3213, 509: 3214}, + // 1905 + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3259}, + {191, 191, 191, 191, 191, 191, 191, 12: 3212, 21: 191, 207: 191, 209: 191, 191, 213: 191, 217: 191, 291: 191, 341: 191, 191, 191, 191, 191, 430: 3211, 3213, 509: 3214}, + {192, 192, 192, 192, 192, 192, 192, 12: 3212, 21: 192, 207: 192, 209: 192, 192, 213: 192, 217: 192, 291: 192, 341: 192, 192, 192, 192, 192, 430: 3211, 3213, 509: 3214}, + {129, 129, 129, 129, 129, 129, 129, 12: 129, 21: 129, 207: 129, 209: 129, 129, 213: 129, 217: 129, 291: 129, 341: 129, 129, 129, 129, 129, 430: 129, 129, 510: 3262}, + {193, 193, 193, 193, 193, 193, 193, 12: 3212, 21: 193, 207: 193, 209: 193, 193, 213: 193, 217: 193, 291: 193, 341: 193, 193, 193, 193, 193, 430: 3211, 3213, 509: 3214}, + // 1910 + {1277, 1277, 4: 1277, 1277, 1277, 21: 1277}, + {291: 1265}, + {217: 3317}, + {1263, 1263, 1263, 1263, 1263, 1263, 1263, 21: 1263, 207: 1263, 209: 1263, 1263, 213: 1263, 217: 1263, 291: 1263, 341: 1263, 1263, 1263, 1263, 1263}, + {1262, 1262, 1262, 1262, 1262, 1262, 1262, 21: 1262, 207: 1262, 209: 1262, 1262, 213: 1262, 217: 1262, 291: 1262, 341: 1262, 1262, 1262, 1262, 1262}, + // 1915 + {291: 3316}, + {1260, 1260, 1260, 1260, 1260, 1260, 1260, 21: 1260, 207: 1260, 209: 1260, 1260, 213: 1260, 217: 1260, 291: 3315, 341: 1260, 1260, 1260, 1260, 1260}, + {208: 1924, 214: 3308, 3309, 217: 1915, 240: 1919, 294: 1914, 1916, 297: 1918, 1917, 301: 1923, 3299, 3296, 305: 1922, 3297, 3298, 1921, 408: 3307, 410: 1920, 625: 3294, 3295, 3305, 656: 3306, 705: 3304}, + {448: 3292}, + {208: 3291}, + // 1920 + {206: 3288}, + {210: 3281}, + {1253, 1253, 1253, 1253, 1253, 1253, 1253, 21: 1253, 207: 1253, 209: 1253, 1253, 213: 1253, 217: 1253, 291: 1253, 341: 1253, 1253, 1253, 1253, 1253}, + {100: 3280}, + {1247, 1247, 1247, 1247, 1247, 1247, 1247, 21: 1247, 207: 1247, 209: 1247, 1247, 213: 1247, 217: 1247, 291: 1247, 341: 1247, 1247, 1247, 1247, 1247}, + // 1925 + {1244, 1244, 3272, 3267, 1244, 1244, 1244, 21: 1244, 207: 3271, 209: 3265, 1252, 213: 3270, 217: 3266, 291: 1266, 341: 3264, 3269, 3273, 3095, 3276, 555: 3275, 575: 3279, 608: 3274, 644: 3268}, + {1246, 1246, 1246, 1246, 1246, 1246, 1246, 21: 1246, 207: 1246, 209: 1246, 1246, 213: 1246, 217: 1246, 291: 1246, 341: 1246, 1246, 1246, 1246, 1246}, + {210: 1251}, + {206: 3282}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3283}, + // 1930 + {21: 3284, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1250, 1250, 1250, 1250, 1250, 1250, 1250, 21: 1250, 207: 1250, 209: 1250, 1250, 213: 1250, 217: 1250, 291: 1250, 341: 1250, 1250, 1250, 1250, 1250, 777: 3287, 805: 3286, 3285}, + {1254, 1254, 1254, 1254, 1254, 1254, 1254, 21: 1254, 207: 1254, 209: 1254, 1254, 213: 1254, 217: 1254, 291: 1254, 341: 1254, 1254, 1254, 1254, 1254}, + {1249, 1249, 1249, 1249, 1249, 1249, 1249, 21: 1249, 207: 1249, 209: 1249, 1249, 213: 1249, 217: 1249, 291: 1249, 341: 1249, 1249, 1249, 1249, 1249}, + {1248, 1248, 1248, 1248, 1248, 1248, 1248, 21: 1248, 207: 1248, 209: 1248, 1248, 213: 1248, 217: 1248, 291: 1248, 341: 1248, 1248, 1248, 1248, 1248}, + // 1935 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3289}, + {21: 3290, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 21: 1255, 207: 1255, 209: 1255, 1255, 213: 1255, 217: 1255, 291: 1255, 341: 1255, 1255, 1255, 1255, 1255}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 21: 1256, 207: 1256, 209: 1256, 1256, 213: 1256, 217: 1256, 291: 1256, 341: 1256, 1256, 1256, 1256, 1256}, + {302: 3299, 3296, 306: 3297, 3298, 625: 3294, 3295, 3293}, + // 1940 + {1257, 1257, 1257, 1257, 1257, 1257, 1257, 21: 1257, 207: 1257, 209: 1257, 1257, 213: 1257, 217: 1257, 291: 1257, 341: 1257, 1257, 1257, 1257, 1257}, + {1227, 1227, 1227, 1227, 1227, 1227, 1227, 21: 1227, 207: 1227, 209: 1227, 1227, 213: 1227, 217: 1227, 291: 1227, 341: 1227, 1227, 1227, 1227, 1227}, + {206: 3300}, + {1220, 1220, 1220, 1220, 1220, 1220, 1220, 21: 1220, 206: 1224, 1220, 209: 1220, 1220, 213: 1220, 217: 1220, 291: 1220, 341: 1220, 1220, 1220, 1220, 1220}, + {1219, 1219, 1219, 1219, 1219, 1219, 1219, 21: 1219, 206: 1223, 1219, 209: 1219, 1219, 213: 1219, 217: 1219, 291: 1219, 341: 1219, 1219, 1219, 1219, 1219}, + // 1945 + {1218, 1218, 1218, 1218, 1218, 1218, 1218, 21: 1218, 206: 1222, 1218, 209: 1218, 1218, 213: 1218, 217: 1218, 291: 1218, 341: 1218, 1218, 1218, 1218, 1218}, + {206: 1221}, + {21: 3301, 240: 1448, 432: 3302}, + {1226, 1226, 1226, 1226, 1226, 1226, 1226, 21: 1226, 207: 1226, 209: 1226, 1226, 213: 1226, 217: 1226, 291: 1226, 341: 1226, 1226, 1226, 1226, 1226}, + {21: 3303}, + // 1950 + {1225, 1225, 1225, 1225, 1225, 1225, 1225, 21: 1225, 207: 1225, 209: 1225, 1225, 213: 1225, 217: 1225, 291: 1225, 341: 1225, 1225, 1225, 1225, 1225}, + {1258, 1258, 1258, 1258, 1258, 1258, 1258, 21: 1258, 207: 1258, 209: 1258, 1258, 213: 1258, 217: 1258, 291: 1258, 341: 1258, 1258, 1258, 1258, 1258}, + {1229, 1229, 1229, 1229, 1229, 1229, 1229, 21: 1229, 207: 1229, 209: 1229, 1229, 213: 1229, 217: 1229, 291: 1229, 341: 1229, 1229, 1229, 1229, 1229}, + {1228, 1228, 1228, 1228, 1228, 1228, 1228, 21: 1228, 207: 1228, 209: 1228, 1228, 213: 1228, 217: 1228, 291: 1228, 341: 1228, 1228, 1228, 1228, 1228}, + {1217, 1217, 1217, 1217, 1217, 1217, 1217, 21: 1217, 207: 1217, 209: 1217, 1217, 213: 1217, 217: 1217, 291: 1217, 341: 1217, 1217, 1217, 1217, 1217}, + // 1955 + {240: 3311, 297: 3313, 3312, 629: 3314}, + {240: 3311, 297: 3313, 3312, 629: 3310}, + {1215, 1215, 1215, 1215, 1215, 1215, 1215, 21: 1215, 207: 1215, 209: 1215, 1215, 213: 1215, 217: 1215, 291: 1215, 341: 1215, 1215, 1215, 1215, 1215}, + {1214, 1214, 1214, 1214, 1214, 1214, 1214, 21: 1214, 207: 1214, 209: 1214, 1214, 213: 1214, 217: 1214, 291: 1214, 341: 1214, 1214, 1214, 1214, 1214}, + {1213, 1213, 1213, 1213, 1213, 1213, 1213, 21: 1213, 207: 1213, 209: 1213, 1213, 213: 1213, 217: 1213, 291: 1213, 341: 1213, 1213, 1213, 1213, 1213}, + // 1960 + {1212, 1212, 1212, 1212, 1212, 1212, 1212, 21: 1212, 207: 1212, 209: 1212, 1212, 213: 1212, 217: 1212, 291: 1212, 341: 1212, 1212, 1212, 1212, 1212}, + {1216, 1216, 1216, 1216, 1216, 1216, 1216, 21: 1216, 207: 1216, 209: 1216, 1216, 213: 1216, 217: 1216, 291: 1216, 341: 1216, 1216, 1216, 1216, 1216}, + {1259, 1259, 1259, 1259, 1259, 1259, 1259, 21: 1259, 207: 1259, 209: 1259, 1259, 213: 1259, 217: 1259, 291: 1259, 341: 1259, 1259, 1259, 1259, 1259}, + {1261, 1261, 1261, 1261, 1261, 1261, 1261, 21: 1261, 207: 1261, 209: 1261, 1261, 213: 1261, 217: 1261, 291: 1261, 341: 1261, 1261, 1261, 1261, 1261}, + {1264, 1264, 1264, 1264, 1264, 1264, 1264, 21: 1264, 207: 1264, 209: 1264, 1264, 213: 1264, 217: 1264, 291: 1264, 341: 1264, 1264, 1264, 1264, 1264}, + // 1965 + {291: 1300, 341: 1300, 1300, 359: 1300, 372: 1300, 1300}, + {1299, 1299, 6: 1299, 291: 1299, 341: 1299, 1299, 359: 1299, 372: 1299, 1299}, + {1157, 1157}, + {1193, 1193, 206: 1193, 210: 1193, 236: 1193, 347: 1193, 352: 1193, 354: 3393, 758: 3392}, + {7: 1194, 239: 1194, 353: 1194}, + // 1970 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 232: 3390, 348: 1691, 1459, 1460, 1458, 434: 3389}, + {7: 2276, 239: 3384, 353: 2275, 449: 3383}, + {232: 3131, 240: 1117, 436: 3381}, + {208: 1117, 232: 3131, 436: 3379}, + {232: 3131, 240: 1117, 436: 3377}, + // 1975 + {208: 1117, 232: 3131, 436: 3375}, + {232: 3131, 240: 1117, 436: 3373}, + {208: 1117, 232: 3131, 436: 3371}, + {208: 1117, 232: 3131, 436: 3369}, + {232: 3131, 240: 1117, 436: 3367}, + // 1980 + {232: 3131, 240: 1117, 436: 3365}, + {232: 3131, 240: 1117, 436: 3363}, + {232: 3131, 240: 1117, 436: 3361}, + {218, 218, 218, 218, 6: 218, 218, 218, 218, 218, 218, 13: 218, 218, 218, 218, 218, 218, 218, 218, 206: 218, 210: 218, 213: 218, 236: 218, 239: 218, 347: 218, 352: 218, 218, 218, 218, 218}, + {213: 1117, 232: 3131, 240: 1117, 436: 3359}, + // 1985 + {232: 3131, 240: 1117, 436: 3357}, + {213: 1117, 232: 3131, 240: 1117, 436: 3353}, + {209, 209, 3326, 3325, 6: 3351, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 206: 209, 210: 209, 213: 3322, 236: 209, 239: 1195, 347: 209, 352: 209, 1195, 209, 3339, 3338, 472: 3324, 495: 3336, 499: 3350}, + {208, 208, 208, 208, 6: 208, 208, 208, 208, 208, 208, 13: 208, 208, 208, 208, 208, 208, 208, 208, 206: 208, 210: 208, 213: 208, 236: 208, 239: 208, 347: 208, 352: 208, 208, 208, 208, 208}, + {75: 1117, 1117, 82: 1117, 84: 1117, 90: 1117, 213: 1117, 232: 3131, 436: 3343}, + // 1990 + {75: 3349, 3347, 82: 3345, 84: 3346, 90: 3348, 213: 3344}, + {202, 202, 202, 202, 6: 202, 202, 202, 202, 202, 202, 13: 202, 202, 202, 202, 202, 202, 202, 202, 206: 202, 210: 202, 213: 202, 236: 202, 239: 202, 347: 202, 352: 202, 202, 202, 202, 202}, + {201, 201, 201, 201, 6: 201, 201, 201, 201, 201, 201, 13: 201, 201, 201, 201, 201, 201, 201, 201, 206: 201, 210: 201, 213: 201, 236: 201, 239: 201, 347: 201, 352: 201, 201, 201, 201, 201}, + {200, 200, 200, 200, 6: 200, 200, 200, 200, 200, 200, 13: 200, 200, 200, 200, 200, 200, 200, 200, 206: 200, 210: 200, 213: 200, 236: 200, 239: 200, 347: 200, 352: 200, 200, 200, 200, 200}, + {199, 199, 199, 199, 6: 199, 199, 199, 199, 199, 199, 13: 199, 199, 199, 199, 199, 199, 199, 199, 206: 199, 210: 199, 213: 199, 236: 199, 239: 199, 347: 199, 352: 199, 199, 199, 199, 199}, + // 1995 + {198, 198, 198, 198, 6: 198, 198, 198, 198, 198, 198, 13: 198, 198, 198, 198, 198, 198, 198, 198, 206: 198, 210: 198, 213: 198, 236: 198, 239: 198, 347: 198, 352: 198, 198, 198, 198, 198}, + {197, 197, 197, 197, 6: 197, 197, 197, 197, 197, 197, 13: 197, 197, 197, 197, 197, 197, 197, 197, 206: 197, 210: 197, 213: 197, 236: 197, 239: 197, 347: 197, 352: 197, 197, 197, 197, 197}, + {207, 207, 207, 207, 6: 207, 207, 207, 207, 207, 207, 13: 207, 207, 207, 207, 207, 207, 207, 207, 206: 207, 210: 207, 213: 207, 236: 207, 239: 207, 347: 207, 352: 207, 207, 207, 207, 207}, + {2: 3326, 3325, 7: 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 213: 3322, 239: 1195, 353: 1195, 355: 3339, 3338, 472: 3324, 495: 3336, 499: 3352}, + {206, 206, 206, 206, 6: 206, 206, 206, 206, 206, 206, 13: 206, 206, 206, 206, 206, 206, 206, 206, 206: 206, 210: 206, 213: 206, 236: 206, 239: 206, 347: 206, 352: 206, 206, 206, 206, 206}, + // 2000 + {213: 3355, 240: 1448, 432: 2259, 443: 3356, 658: 3354}, + {215, 215, 215, 215, 6: 215, 215, 215, 215, 215, 215, 13: 215, 215, 215, 215, 215, 215, 215, 215, 206: 215, 210: 215, 213: 215, 236: 215, 239: 215, 347: 215, 352: 215, 215, 215, 215, 215}, + {214, 214, 214, 214, 6: 214, 214, 214, 214, 214, 214, 13: 214, 214, 214, 214, 214, 214, 214, 214, 206: 214, 210: 214, 213: 214, 236: 214, 239: 214, 347: 214, 352: 214, 214, 214, 214, 214}, + {213, 213, 213, 213, 6: 213, 213, 213, 213, 213, 213, 13: 213, 213, 213, 213, 213, 213, 213, 213, 206: 213, 210: 213, 213: 213, 236: 213, 239: 213, 347: 213, 352: 213, 213, 213, 213, 213}, + {240: 1448, 432: 2259, 443: 3358}, + // 2005 + {216, 216, 216, 216, 6: 216, 216, 216, 216, 216, 216, 13: 216, 216, 216, 216, 216, 216, 216, 216, 206: 216, 210: 216, 213: 216, 236: 216, 239: 216, 347: 216, 352: 216, 216, 216, 216, 216}, + {213: 3355, 240: 1448, 432: 2259, 443: 3356, 658: 3360}, + {217, 217, 217, 217, 6: 217, 217, 217, 217, 217, 217, 13: 217, 217, 217, 217, 217, 217, 217, 217, 206: 217, 210: 217, 213: 217, 236: 217, 239: 217, 347: 217, 352: 217, 217, 217, 217, 217}, + {240: 1448, 432: 2259, 443: 3362}, + {219, 219, 219, 219, 6: 219, 219, 219, 219, 219, 219, 13: 219, 219, 219, 219, 219, 219, 219, 219, 206: 219, 210: 219, 213: 219, 236: 219, 239: 219, 347: 219, 352: 219, 219, 219, 219, 219}, + // 2010 + {240: 1448, 432: 2259, 443: 3364}, + {220, 220, 220, 220, 6: 220, 220, 220, 220, 220, 220, 13: 220, 220, 220, 220, 220, 220, 220, 220, 206: 220, 210: 220, 213: 220, 236: 220, 239: 220, 347: 220, 352: 220, 220, 220, 220, 220}, + {240: 1448, 432: 2259, 443: 3366}, + {221, 221, 221, 221, 6: 221, 221, 221, 221, 221, 221, 13: 221, 221, 221, 221, 221, 221, 221, 221, 206: 221, 210: 221, 213: 221, 236: 221, 239: 221, 347: 221, 352: 221, 221, 221, 221, 221}, + {240: 1448, 432: 2259, 443: 3368}, + // 2015 + {222, 222, 222, 222, 6: 222, 222, 222, 222, 222, 222, 13: 222, 222, 222, 222, 222, 222, 222, 222, 206: 222, 210: 222, 213: 222, 236: 222, 239: 222, 347: 222, 352: 222, 222, 222, 222, 222}, + {208: 3370}, + {223, 223, 223, 223, 6: 223, 223, 223, 223, 223, 223, 13: 223, 223, 223, 223, 223, 223, 223, 223, 206: 223, 210: 223, 213: 223, 236: 223, 239: 223, 347: 223, 352: 223, 223, 223, 223, 223}, + {208: 3372}, + {224, 224, 224, 224, 6: 224, 224, 224, 224, 224, 224, 13: 224, 224, 224, 224, 224, 224, 224, 224, 206: 224, 210: 224, 213: 224, 236: 224, 239: 224, 347: 224, 352: 224, 224, 224, 224, 224}, + // 2020 + {240: 1448, 432: 2259, 443: 3374}, + {225, 225, 225, 225, 6: 225, 225, 225, 225, 225, 225, 13: 225, 225, 225, 225, 225, 225, 225, 225, 206: 225, 210: 225, 213: 225, 236: 225, 239: 225, 347: 225, 352: 225, 225, 225, 225, 225}, + {208: 3376}, + {226, 226, 226, 226, 6: 226, 226, 226, 226, 226, 226, 13: 226, 226, 226, 226, 226, 226, 226, 226, 206: 226, 210: 226, 213: 226, 236: 226, 239: 226, 347: 226, 352: 226, 226, 226, 226, 226}, + {240: 1448, 432: 2259, 443: 3378}, + // 2025 + {227, 227, 227, 227, 6: 227, 227, 227, 227, 227, 227, 13: 227, 227, 227, 227, 227, 227, 227, 227, 206: 227, 210: 227, 213: 227, 236: 227, 239: 227, 347: 227, 352: 227, 227, 227, 227, 227}, + {208: 3380}, + {228, 228, 228, 228, 6: 228, 228, 228, 228, 228, 228, 13: 228, 228, 228, 228, 228, 228, 228, 228, 206: 228, 210: 228, 213: 228, 236: 228, 239: 228, 347: 228, 352: 228, 228, 228, 228, 228}, + {240: 1448, 432: 2259, 443: 3382}, + {229, 229, 229, 229, 6: 229, 229, 229, 229, 229, 229, 13: 229, 229, 229, 229, 229, 229, 229, 229, 206: 229, 210: 229, 213: 229, 236: 229, 239: 229, 347: 229, 352: 229, 229, 229, 229, 229}, + // 2030 + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 248: 1117, 436: 3387}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 436: 3385}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3386}, + {230, 230, 230, 230, 6: 230, 230, 230, 230, 230, 230, 13: 230, 230, 230, 230, 230, 230, 230, 230, 206: 230, 210: 230, 213: 230, 236: 230, 239: 230, 347: 230, 352: 230, 230, 230, 230, 230}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 3388}, + // 2035 + {231, 231, 231, 231, 6: 231, 231, 231, 231, 231, 231, 13: 231, 231, 231, 231, 231, 231, 231, 231, 206: 231, 210: 231, 213: 231, 236: 231, 239: 231, 347: 231, 352: 231, 231, 231, 231, 231}, + {233, 233, 233, 233, 6: 233, 233, 233, 233, 233, 233, 13: 233, 233, 233, 233, 233, 233, 233, 233, 206: 233, 210: 233, 213: 233, 236: 233, 239: 233, 347: 233, 352: 233, 233, 233, 233, 233}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3391}, + {232, 232, 232, 232, 6: 232, 232, 232, 232, 232, 232, 13: 232, 232, 232, 232, 232, 232, 232, 232, 206: 232, 210: 232, 213: 232, 236: 232, 239: 232, 347: 232, 352: 232, 232, 232, 232, 232}, + {1166, 1166, 206: 1166, 210: 1166, 236: 3472, 347: 3471, 352: 1166, 707: 3470}, + // 2040 + {362: 3394}, + {60: 3396, 291: 3395, 763: 3397}, + {206: 3465}, + {206: 3460}, + {27: 3399, 206: 3398}, + // 2045 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3441}, + {206: 3400}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 3401}, + {6: 1730, 21: 3402}, + {1183, 1183, 54: 3404, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3403}, + // 2050 + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3406}, + {240: 1448, 432: 3405}, + {1182, 1182, 55: 1182, 206: 1182, 210: 1182, 236: 1182, 347: 1182, 352: 1182}, + {1189, 1189, 206: 1189, 210: 1189, 236: 1189, 347: 1189, 352: 1189}, + {354: 3410, 640: 3409, 757: 3408}, + // 2055 + {6: 3439, 21: 3438}, + {6: 1179, 21: 1179}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3411, 1459, 1460, 1458}, + {2: 1169, 6: 1169, 9: 1169, 21: 1169, 26: 1169, 292: 3413, 756: 3412}, + {2: 3428, 6: 1176, 9: 3429, 21: 1176, 26: 3430, 639: 3427, 754: 3426, 3425}, + // 2060 + {127: 3414}, + {160: 3415}, + {206: 3417, 550: 3416}, + {2: 1168, 6: 1168, 9: 1168, 21: 1168, 26: 1168}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3419, 550: 3420, 624: 3421, 741: 3418}, + // 2065 + {6: 3423, 21: 3422}, + {6: 1093, 21: 1093, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {6: 1094, 21: 1094}, + {6: 1086, 21: 1086}, + {2: 1167, 6: 1167, 9: 1167, 21: 1167, 26: 1167}, + // 2070 + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3419, 550: 3420, 624: 3424}, + {6: 1085, 21: 1085}, + {6: 1177, 21: 1177}, + {2: 3428, 6: 1175, 9: 3429, 21: 1175, 26: 3430, 639: 3437}, + {2: 1174, 6: 1174, 9: 1174, 21: 1174, 26: 1174}, + // 2075 + {208: 1117, 232: 3131, 436: 3435}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 232: 3131, 436: 3433}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 232: 3131, 436: 3431}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3432, 1459, 1460, 1458}, + {2: 1170, 6: 1170, 9: 1170, 21: 1170, 26: 1170}, + // 2080 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3434, 1459, 1460, 1458}, + {2: 1171, 6: 1171, 9: 1171, 21: 1171, 26: 1171}, + {208: 3436}, + {2: 1172, 6: 1172, 9: 1172, 21: 1172, 26: 1172}, + {2: 1173, 6: 1173, 9: 1173, 21: 1173, 26: 1173}, + // 2085 + {1180, 1180, 6: 1180, 206: 1180, 210: 1180, 236: 1180, 347: 1180, 352: 1180}, + {354: 3410, 640: 3440}, + {6: 1178, 21: 1178}, + {21: 3442, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1183, 1183, 54: 3404, 1183, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3443}, + // 2090 + {1188, 1188, 55: 3445, 206: 1188, 210: 1188, 236: 1188, 347: 1188, 352: 1188, 779: 3444}, + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3459}, + {362: 3446}, + {60: 3447, 291: 3448}, + {206: 3455}, + // 2095 + {206: 3449}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 3450}, + {6: 1730, 21: 3451}, + {1185, 1185, 95: 3453, 206: 1185, 210: 1185, 236: 1185, 347: 1185, 352: 1185, 660: 3452}, + {1186, 1186, 206: 1186, 210: 1186, 236: 1186, 347: 1186, 352: 1186}, + // 2100 + {240: 1448, 432: 3454}, + {1184, 1184, 206: 1184, 210: 1184, 236: 1184, 347: 1184, 352: 1184}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3456}, + {21: 3457, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1185, 1185, 95: 3453, 206: 1185, 210: 1185, 236: 1185, 347: 1185, 352: 1185, 660: 3458}, + // 2105 + {1187, 1187, 206: 1187, 210: 1187, 236: 1187, 347: 1187, 352: 1187}, + {1190, 1190, 206: 1190, 210: 1190, 236: 1190, 347: 1190, 352: 1190}, + {2: 1540, 1463, 1464, 1496, 7: 1889, 1545, 1489, 1542, 1894, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1898, 1891, 1893, 1908, 1909, 1907, 1903, 1910, 1899, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1890, 1556, 1505, 1579, 1519, 1895, 1900, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1896, 1526, 1897, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1901, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1887, 1888, 1635, 1636, 1637, 1472, 1638, 1906, 1640, 1641, 1642, 1643, 1493, 1644, 1892, 1911, 1646, 1886, 1650, 1649, 1506, 1652, 1654, 1510, 1904, 1902, 1905, 1536, 1565, 1568, 1655, 1656, 1657, 1912, 1913, 1661, 1942, 208: 1924, 1882, 211: 1953, 1957, 1948, 1939, 1938, 1974, 1915, 236: 1956, 240: 1919, 247: 1927, 1944, 282: 1958, 286: 1951, 1973, 1975, 1880, 1972, 292: 1949, 1943, 1914, 1916, 1947, 1918, 1917, 1933, 1950, 1923, 1954, 1962, 1998, 1922, 1963, 1964, 1921, 1952, 1936, 1937, 1986, 1988, 1989, 1990, 1945, 1991, 1970, 1976, 1984, 1985, 1980, 1992, 1993, 1994, 1981, 1987, 1982, 1995, 1977, 1983, 1968, 1946, 1959, 1961, 1940, 1955, 1960, 1965, 1966, 348: 1926, 1459, 1460, 1458, 406: 1941, 1997, 1932, 1928, 1920, 1931, 1929, 1930, 1967, 1979, 1978, 1971, 1969, 1925, 1935, 1996, 1934, 1885, 1884, 1883, 3461}, + {21: 3462, 225: 2014, 2012, 2013, 2011, 2009, 427: 2010, 2008}, + {1183, 1183, 54: 3404, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3463}, + // 2110 + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3464}, + {1191, 1191, 206: 1191, 210: 1191, 236: 1191, 347: 1191, 352: 1191}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 1726, 470: 3466}, + {6: 1730, 21: 3467}, + {1183, 1183, 54: 3404, 206: 1183, 210: 1183, 236: 1183, 347: 1183, 352: 1183, 527: 3468}, + // 2115 + {1181, 1181, 206: 3407, 210: 1181, 236: 1181, 347: 1181, 352: 1181, 514: 3469}, + {1192, 1192, 206: 1192, 210: 1192, 236: 1192, 347: 1192, 352: 1192}, + {1163, 1163, 206: 1163, 210: 3474, 352: 1163, 682: 3473}, + {1165, 1165, 206: 1165, 210: 1165, 352: 1165}, + {1164, 1164, 206: 1164, 210: 1164, 352: 1164}, + // 2120 + {1161, 1161, 206: 1383, 352: 1379, 406: 3478, 437: 3476, 1380, 1381, 1382, 444: 1385, 1384, 3477, 700: 3475}, + {1162, 1162, 206: 1162, 352: 1162}, + {1197, 1197}, + {1160, 1160, 219: 430}, + {1159, 1159}, + // 2125 + {1158, 1158}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1835, 1459, 1460, 1458, 506: 3480}, + {1201, 1201, 7: 1195, 213: 3322, 239: 1195, 353: 1195, 472: 3482, 583: 3484, 701: 3483, 3481}, + {1205, 1205}, + {7: 2276, 239: 3487, 353: 2275, 449: 3486}, + // 2130 + {1200, 1200, 7: 1195, 213: 3322, 239: 1195, 353: 1195, 472: 3482, 583: 3485}, + {1199, 1199, 7: 1199, 213: 1199, 239: 1199, 353: 1199}, + {1198, 1198, 7: 1198, 213: 1198, 239: 1198, 353: 1198}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 248: 1117, 436: 3490}, + {2: 1117, 1117, 1117, 1117, 7: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 22: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 208: 1117, 232: 3131, 436: 3488}, + // 2135 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 348: 1691, 1459, 1460, 1458, 434: 3489}, + {1202, 1202, 7: 1202, 213: 1202, 239: 1202, 353: 1202}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 3491}, + {1203, 1203, 7: 1203, 213: 1203, 239: 1203, 353: 1203}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3493, 1459, 1460, 1458}, + // 2140 + {207: 1012, 231: 3118, 464: 3119, 523: 3494}, + {207: 3495}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3496}, + {206: 3497}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3087, 474: 3088, 482: 3498}, + // 2145 + {6: 3092, 21: 3499}, + {1019, 1019, 1019, 8: 1019, 220: 1019, 231: 1019, 513: 3500}, + {1321, 1321, 3129, 8: 3127, 220: 3502, 231: 3118, 464: 3128, 512: 3126, 549: 3501, 739: 3503}, + {1320, 1320}, + {232: 3504}, + // 2150 + {1211, 1211}, + {117: 3508, 137: 3505, 149: 3507, 213: 3506}, + {1319, 1319, 6: 1319}, + {1318, 1318, 6: 1318}, + {1317, 1317, 6: 1317}, + // 2155 + {1316, 1316, 6: 1316}, + {1280, 1280}, + {1282, 1282, 218: 3511}, + {111: 3512}, + {152: 3513}, + // 2160 + {1281, 1281}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3516, 468: 3515}, + {1290, 1290, 6: 2570, 218: 3524, 492: 3532}, + {538, 538, 6: 538, 218: 538, 354: 3518, 359: 3517}, + {493, 493, 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 493, 348: 2490, 1459, 1460, 1458, 522: 3530}, + // 2165 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3519, 1459, 1460, 1458, 641: 3520}, + {1304, 1304, 6: 1304, 218: 1304, 359: 1304}, + {1290, 1290, 6: 3521, 218: 3524, 359: 3523, 492: 3522}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3529, 1459, 1460, 1458}, + {1292, 1292}, + // 2170 + {493, 493, 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 493, 348: 2490, 1459, 1460, 1458, 522: 3527}, + {240: 1448, 432: 3525}, + {73: 3526}, + {1289, 1289}, + {1290, 1290, 6: 2492, 218: 3524, 492: 3528}, + // 2175 + {1291, 1291}, + {1303, 1303, 6: 1303, 218: 1303, 359: 1303}, + {1290, 1290, 6: 2492, 218: 3524, 492: 3531}, + {1293, 1293}, + {1294, 1294}, + // 2180 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3536, 667: 3535, 787: 3534}, + {1298, 1298, 6: 3539}, + {1297, 1297, 6: 1297}, + {368: 3537}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3538}, + // 2185 + {1295, 1295, 6: 1295}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3536, 667: 3540}, + {1296, 1296, 6: 1296}, + {442: 3551}, + {2: 1027, 1027, 1027, 1027, 7: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 22: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 208: 1027, 282: 1027, 286: 2980, 543: 3543}, + // 2190 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 3544, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 282: 1782, 348: 1691, 1459, 1460, 1458, 434: 1781, 459: 1783, 518: 1784, 531: 3545}, + {930, 930, 6: 930, 30: 930, 206: 3546, 289: 930, 379: 930}, + {99, 99, 6: 1786}, + {21: 3547}, + {30: 3548}, + // 2195 + {362: 3549}, + {208: 1797, 520: 3550}, + {98, 98}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3552}, + {212, 212, 3326, 3325, 6: 212, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 46: 3566, 80: 3559, 83: 3560, 88: 3561, 213: 3322, 220: 3502, 239: 1195, 296: 3556, 353: 1195, 355: 3339, 3338, 363: 3567, 365: 3558, 370: 3563, 3554, 377: 3564, 380: 3557, 383: 3562, 472: 3324, 495: 3336, 499: 3341, 549: 3565, 559: 3569, 565: 3555, 3568, 680: 3553}, + // 2200 + {1351, 1351, 6: 3638}, + {354: 3632}, + {1348, 1348, 6: 1348}, + {368: 3628}, + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 291: 1302, 341: 1302, 1302, 354: 3618, 359: 1302, 372: 1302, 1302, 504: 3585, 3616, 536: 3617, 3061, 3064}, + // 2205 + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 291: 2499, 341: 3605, 354: 3606, 359: 2500, 372: 3608, 475: 3607, 504: 3585, 3604}, + {548: 3603}, + {548: 3602}, + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 504: 3585, 3599}, + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 504: 3585, 3592}, + // 2210 + {2: 1311, 1311, 1311, 1311, 7: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 22: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 504: 3585, 3584}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 210: 3577, 291: 2499, 348: 1662, 1459, 1460, 1458, 359: 2500, 368: 3575, 429: 3576, 475: 3578}, + {1327, 1327, 6: 1327}, + {77: 1117, 86: 1117, 213: 1117, 232: 3131, 436: 3570}, + {1325, 1325, 6: 1325}, + // 2215 + {1306, 1306, 6: 1306}, + {211, 211, 3326, 3325, 6: 211, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 213: 3322, 239: 1195, 353: 1195, 355: 3339, 3338, 472: 3324, 495: 3336, 499: 3350}, + {77: 3574, 86: 3573, 213: 3572, 679: 3571}, + {1326, 1326, 6: 1326}, + {1324, 1324, 6: 1324}, + // 2220 + {1323, 1323, 6: 1323}, + {1322, 1322, 6: 1322}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3583}, + {1330, 1330, 6: 1330}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1662, 1459, 1460, 1458, 429: 3582}, + // 2225 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3579, 1459, 1460, 1458}, + {368: 3580}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3581, 1459, 1460, 1458}, + {1328, 1328, 6: 1328}, + {1329, 1329, 6: 1329}, + // 2230 + {1331, 1331, 6: 1331}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3586}, + {2: 1310, 1310, 1310, 1310, 7: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 22: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310}, + {234: 3587, 365: 3588}, + {213: 3590}, + // 2235 + {213: 3589}, + {1332, 1332, 6: 1332}, + {208: 1924, 214: 3308, 3309, 217: 1915, 240: 1919, 294: 1914, 1916, 297: 1918, 1917, 301: 1923, 305: 1922, 308: 1921, 408: 3307, 410: 1920, 656: 3591}, + {1333, 1333, 6: 1333}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3593}, + // 2240 + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3594}, + {1309, 1309, 4: 3597, 3596, 1309, 535: 3595}, + {1334, 1334, 6: 1334}, + {1308, 1308, 6: 1308}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3598}, + // 2245 + {1307, 1307, 6: 1307}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3600}, + {1309, 1309, 4: 3597, 3596, 1309, 535: 3601}, + {1335, 1335, 6: 1335}, + {1336, 1336, 6: 1336}, + // 2250 + {1337, 1337, 6: 1337}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3614}, + {291: 3613}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3612, 1459, 1460, 1458}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3611, 1459, 1460, 1458}, + // 2255 + {291: 3609}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3319, 1459, 1460, 1458, 661: 3610}, + {1338, 1338, 6: 1338}, + {1339, 1339, 6: 1339}, + {1340, 1340, 6: 1340}, + // 2260 + {1341, 1341, 6: 1341}, + {1122, 1122, 6: 1122, 366: 2977, 2976, 556: 3615}, + {1342, 1342, 6: 1342}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 3621, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3620}, + {1344, 1344, 6: 1344}, + // 2265 + {1181, 1181, 6: 1181, 206: 3407, 514: 3619}, + {1343, 1343, 6: 1343}, + {1309, 1309, 4: 3597, 3596, 1309, 535: 3627}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3623, 690: 3622}, + {6: 3625, 21: 3624}, + // 2270 + {6: 1279, 21: 1279}, + {1345, 1345, 6: 1345}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 1725, 1459, 1460, 1458, 433: 3062, 477: 3626}, + {6: 1278, 21: 1278}, + {1346, 1346, 6: 1346}, + // 2275 + {7: 2276, 353: 2275, 449: 3629}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 208: 1690, 248: 1689, 348: 1691, 1459, 1460, 1458, 434: 1688, 469: 3630}, + {114, 114, 6: 114, 239: 3229, 476: 3631}, + {1347, 1347, 6: 1347}, + {2: 1540, 1463, 1464, 1496, 7: 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 348: 3519, 1459, 1460, 1458, 641: 3633}, + // 2280 + {1290, 1290, 6: 3521, 218: 3524, 359: 3635, 492: 3634}, + {1350, 1350}, + {493, 493, 1540, 1463, 1464, 1496, 493, 1474, 1545, 1489, 1542, 1508, 1514, 1543, 1541, 1544, 1555, 1547, 1548, 1551, 1583, 22: 1576, 1595, 1517, 1520, 1521, 1475, 1611, 1495, 1538, 1651, 1631, 1633, 1632, 1532, 1483, 1503, 1589, 1590, 1586, 1552, 1594, 1534, 1488, 1572, 1610, 1494, 1507, 1509, 1482, 1481, 1556, 1505, 1579, 1519, 1524, 1537, 1564, 1609, 1502, 1557, 1587, 1567, 1592, 1606, 1603, 1581, 1529, 1530, 1619, 1467, 1574, 1620, 1476, 1477, 1478, 1639, 1622, 1484, 1569, 1485, 1487, 1570, 1497, 1498, 1647, 1623, 1577, 1573, 1511, 1512, 1608, 1516, 1625, 1518, 1525, 1526, 1528, 1461, 1465, 1468, 1470, 1469, 1471, 1621, 1617, 1473, 1604, 1539, 1559, 1479, 1480, 1486, 1490, 1491, 1578, 1582, 1500, 1575, 1501, 1553, 1492, 1566, 1648, 1612, 1624, 1504, 1563, 1546, 1599, 1600, 1601, 1602, 1613, 1533, 1549, 1580, 1561, 1591, 1588, 1593, 1653, 1618, 1558, 1616, 1562, 1513, 1596, 1597, 1605, 1598, 1515, 1628, 1629, 1627, 1626, 1607, 1614, 1522, 1523, 1630, 1660, 1527, 1554, 1560, 1615, 1531, 1634, 1535, 1462, 1466, 1635, 1636, 1637, 1472, 1638, 1585, 1640, 1641, 1642, 1643, 1493, 1644, 1499, 1645, 1646, 1457, 1650, 1649, 1506, 1652, 1654, 1510, 1571, 1550, 1584, 1536, 1565, 1568, 1655, 1656, 1657, 1658, 1659, 1661, 218: 493, 348: 2490, 1459, 1460, 1458, 522: 3636}, + {1290, 1290, 6: 2492, 218: 3524, 492: 3637}, + {1349, 1349}, + // 2285 + {212, 212, 3326, 3325, 6: 212, 1195, 3332, 3323, 3328, 3330, 13: 3329, 3327, 3331, 3335, 3333, 3334, 3342, 3337, 46: 3566, 80: 3559, 83: 3560, 88: 3561, 213: 3322, 220: 3502, 239: 1195, 296: 3556, 353: 1195, 355: 3339, 3338, 363: 3567, 365: 3558, 370: 3563, 377: 3564, 380: 3557, 383: 3562, 472: 3324, 495: 3336, 499: 3341, 549: 3565, 559: 3569, 565: 3555, 3639}, + {1305, 1305, 6: 1305}, + {1115, 1115, 47: 1375, 49: 1374, 70: 1388, 1359, 1361, 74: 1362, 79: 1377, 81: 1364, 85: 1390, 91: 1378, 93: 1360, 97: 1367, 1437, 206: 1383, 220: 1444, 234: 1387, 236: 1373, 249: 1370, 287: 1372, 352: 1379, 364: 1439, 1366, 370: 1356, 1358, 377: 1357, 406: 1429, 437: 1386, 1380, 1381, 1382, 444: 1385, 1384, 1426, 448: 1438, 454: 1365, 486: 1363, 488: 1400, 490: 1440, 1417, 494: 1424, 497: 1389, 502: 1432, 564: 1392, 567: 1393, 1394, 1395, 1396, 1397, 577: 1398, 1403, 1404, 1405, 1407, 1406, 586: 1399, 1376, 1369, 1408, 1409, 1410, 1414, 1411, 1413, 1412, 1391, 1401, 1368, 1402, 1371, 604: 1415, 609: 1416, 616: 1446, 1445, 1418, 620: 1442, 1419, 1420, 1435, 643: 1421, 649: 1423, 1441, 1425, 1422, 1427, 1428, 657: 3641, 669: 1430, 1431, 1443, 1434, 674: 1433}, + {242, 242}, + } +) + +var yyDebug = 0 + +type yyLexer interface { + Lex(lval *yySymType) int + Errorf(format string, a ...interface{}) + Errors() []error +} + +type yyLexerEx interface { + yyLexer + Reduced(rule, state int, lval *yySymType) bool +} + +func yySymName(c int) (s string) { + x, ok := yyXLAT[c] + if ok { + return yySymNames[x] + } + + return __yyfmt__.Sprintf("%d", c) +} + +func yylex1(yylex yyLexer, lval *yySymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = yyEOFCode + } + if yyDebug >= 3 { + __yyfmt__.Printf("\nlex %s(%#x %d), lval: %+v\n", yySymName(n), n, n, lval) + } + return n +} + +func yyParse(yylex yyLexer, parser *Parser) int { + const yyError = 819 + + yyEx, _ := yylex.(yyLexerEx) + var yyn int + parser.yylval = yySymType{} + parser.yyVAL = yySymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if yyDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + yyS[yyp] = parser.yyVAL + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = yylex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = yyXLAT[yychar]; !ok { + yyxchar = len(yySymNames) // > tab width + } + } + if yyDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %v\n", a) + } + row := yyParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += yyTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if yyDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if yyDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if yyDebug >= 1 { + __yyfmt__.Printf("no action for %s in state %d\n", yySymName(yychar), yystate) + } + msg, ok := yyXErrors[yyXError{yystate, yyxchar}] + if !ok { + msg, ok = yyXErrors[yyXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = yyXErrors[yyXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = yyXErrors[yyXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.Errorf("") + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := yyParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError]) + yyTabOfs + if yyn > 0 { // hit + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", yySymName(yychar)) + } + if yychar == yyEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := yyReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(yyParseTab[yyS[yyp].yys][x]) + yyTabOfs + /* reduction by production r */ + if yyDebug >= 2 { + __yyfmt__.Printf("reduce using rule %v (%s), and goto state %d\n", r, yySymNames[x], yystate) + } + + switch r { + case 2: + { + parser.yyVAL.statement = &ast.AlterTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + Specs: yyS[yypt-0].item.([]*ast.AlterTableSpec), + } + } + case 3: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-1].item.([]model.CIStr), MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 4: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-6].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: yyS[yypt-0].item.(uint64), + } + } + case 5: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: yyS[yypt-0].item.([]*ast.TableOption), + } + } + case 6: + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-1].item.(string)}}, + } + if yyS[yypt-0].item != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)}) + } + parser.yyVAL.item = op + } + case 7: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 8: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: yyS[yypt-1].item.([]*ast.ColumnDef), + } + } + case 9: + { + constraint := yyS[yypt-0].item.(*ast.Constraint) + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } + case 10: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } + case 11: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropColumn, + OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), + } + } + case 12: + { + parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } + case 13: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropPartition, + Name: yyS[yypt-0].ident, + } + } + case 14: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropIndex, + Name: yyS[yypt-0].ident, + } + } + case 15: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropForeignKey, + Name: yyS[yypt-0].item.(string), + } + } + case 16: + { + parser.yyVAL.item = &ast.AlterTableSpec{} + } + case 17: + { + parser.yyVAL.item = &ast.AlterTableSpec{} + } + case 18: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 19: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableChangeColumn, + OldColumnName: yyS[yypt-2].item.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 20: + { + option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} + colDef := &ast.ColumnDef{ + Name: yyS[yypt-3].item.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 21: + { + colDef := &ast.ColumnDef{ + Name: yyS[yypt-2].item.(*ast.ColumnName), + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 22: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 23: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 24: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 25: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: model.NewCIStr(yyS[yypt-2].ident), + ToKey: model.NewCIStr(yyS[yypt-0].ident), + } + } + case 26: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: yyS[yypt-0].item.(ast.LockType), + } + } + case 27: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + } + } + case 28: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } + case 34: + { + parser.yyVAL.item = ast.LockTypeNone + } + case 35: + { + parser.yyVAL.item = ast.LockTypeDefault + } + case 36: + { + parser.yyVAL.item = ast.LockTypeShared + } + case 37: + { + parser.yyVAL.item = ast.LockTypeExclusive + } + case 44: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } + case 45: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } + case 46: + { + parser.yyVAL.item = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), + } + } + case 47: + { + parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} + } + case 48: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) + } + case 49: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 50: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 51: + { + parser.yyVAL.item = nil + } + case 52: + { + parser.yyVAL.item = nil + } + case 53: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 54: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 55: + { + parser.yyVAL.statement = &ast.RenameTableStmt{ + OldTable: yyS[yypt-0].item.([]*ast.TableToTable)[0].OldTable, + NewTable: yyS[yypt-0].item.([]*ast.TableToTable)[0].NewTable, + TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), + } + } + case 56: + { + parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} + } + case 57: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) + } + case 58: + { + parser.yyVAL.item = &ast.TableToTable{ + OldTable: yyS[yypt-2].item.(*ast.TableName), + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 59: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-1].item.([]*ast.TableName), MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 60: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 61: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, PartitionNames: yyS[yypt-1].item.([]model.CIStr), MaxNumBuckets: yyS[yypt-0].item.(uint64)} + } + case 62: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, + PartitionNames: yyS[yypt-3].item.([]model.CIStr), + IndexNames: yyS[yypt-1].item.([]model.CIStr), + IndexFlag: true, + MaxNumBuckets: yyS[yypt-0].item.(uint64), + } + } + case 63: + { + parser.yyVAL.item = uint64(0) + } + case 64: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) + } + case 65: + { + parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} + } + case 66: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 67: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 68: + { + parser.yyVAL.item = []*ast.Assignment{} + } + case 70: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 71: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 72: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 73: + { + parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} + } + case 74: + { + parser.yyVAL.item = []*ast.ColumnDef{yyS[yypt-0].item.(*ast.ColumnDef)} + } + case 75: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnDef), yyS[yypt-0].item.(*ast.ColumnDef)) + } + case 76: + { + parser.yyVAL.item = &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} + } + case 77: + { + parser.yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 78: + { + parser.yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 79: + { + parser.yyVAL.item = &ast.ColumnName{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 80: + { + parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} + } + case 81: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) + } + case 82: + { + parser.yyVAL.item = []*ast.ColumnName{} + } + case 83: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnName) + } + case 84: + { + parser.yyVAL.item = []*ast.ColumnName{} + } + case 85: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnName) + } + case 86: + { + parser.yyVAL.statement = &ast.CommitStmt{} + } + case 89: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } + case 90: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } + case 91: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } + case 92: + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } + case 93: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 94: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 95: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} + } + case 96: + { + nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} + } + case 97: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident)} + } + case 98: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + parser.yyVAL.item = &ast.ColumnOption{} + } + case 99: + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := yyS[yypt-2].expr + expr.SetText(parser.src[startOffset:endOffset]) + + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: yyS[yypt-0].item.(bool), + } + } + case 100: + { + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 103: + { + parser.yyVAL.item = false + } + case 104: + { + parser.yyVAL.item = false + } + case 105: + { + parser.yyVAL.item = true + } + case 106: + { + parser.yyVAL.item = []*ast.ColumnOption{yyS[yypt-0].item.(*ast.ColumnOption)} + } + case 107: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.(*ast.ColumnOption)) + } + case 108: + { + parser.yyVAL.item = []*ast.ColumnOption{} + } + case 109: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnOption) + } + case 110: + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if yyS[yypt-4].item != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = yyS[yypt-4].item.(model.IndexType) + } + parser.yyVAL.item = c + } + case 111: + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-4].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + parser.yyVAL.item = c + } + case 112: + { + c := &ast.Constraint{ + Tp: ast.ConstraintIndex, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-5].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if yyS[yypt-4].item != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = yyS[yypt-4].item.(model.IndexType) + } + parser.yyVAL.item = c + } + case 113: + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-5].item.(string), + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if yyS[yypt-4].item != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = yyS[yypt-4].item.(model.IndexType) + } + parser.yyVAL.item = c + } + case 114: + { + parser.yyVAL.item = &ast.Constraint{ + Tp: ast.ConstraintForeignKey, + Keys: yyS[yypt-2].item.([]*ast.IndexColName), + Name: yyS[yypt-4].item.(string), + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 115: + { + var onDeleteOpt *ast.OnDeleteOpt + if yyS[yypt-1].item != nil { + onDeleteOpt = yyS[yypt-1].item.(*ast.OnDeleteOpt) + } + var onUpdateOpt *ast.OnUpdateOpt + if yyS[yypt-0].item != nil { + onUpdateOpt = yyS[yypt-0].item.(*ast.OnUpdateOpt) + } + parser.yyVAL.item = &ast.ReferenceDef{ + Table: yyS[yypt-5].item.(*ast.TableName), + IndexColNames: yyS[yypt-3].item.([]*ast.IndexColName), + OnDelete: onDeleteOpt, + OnUpdate: onUpdateOpt, + } + } + case 116: + { + parser.yyVAL.item = &ast.OnDeleteOpt{} + } + case 117: + { + parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 118: + { + parser.yyVAL.item = &ast.OnUpdateOpt{} + } + case 119: + { + parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 120: + { + parser.yyVAL.item = ast.ReferOptionRestrict + } + case 121: + { + parser.yyVAL.item = ast.ReferOptionCascade + } + case 122: + { + parser.yyVAL.item = ast.ReferOptionSetNull + } + case 123: + { + parser.yyVAL.item = ast.ReferOptionNoAction + } + case 126: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 127: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 128: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} + } + case 136: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr) + } + case 137: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item)} + } + case 138: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item)} + } + case 142: + { + var indexOption *ast.IndexOption + if yyS[yypt-1].item != nil { + indexOption = yyS[yypt-1].item.(*ast.IndexOption) + if indexOption.Tp == model.IndexTypeInvalid { + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(model.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(model.IndexType) + } + } + parser.yyVAL.statement = &ast.CreateIndexStmt{ + Unique: yyS[yypt-10].item.(bool), + IndexName: yyS[yypt-8].ident, + Table: yyS[yypt-5].item.(*ast.TableName), + IndexColNames: yyS[yypt-3].item.([]*ast.IndexColName), + IndexOption: indexOption, + } + } + case 143: + { + parser.yyVAL.item = false + } + case 144: + { + parser.yyVAL.item = true + } + case 145: + { + //Order is parsed but just ignored as MySQL did + parser.yyVAL.item = &ast.IndexColName{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int)} + } + case 146: + { + parser.yyVAL.item = []*ast.IndexColName{yyS[yypt-0].item.(*ast.IndexColName)} + } + case 147: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexColName), yyS[yypt-0].item.(*ast.IndexColName)) + } + case 148: + { + parser.yyVAL.statement = &ast.CreateDatabaseStmt{ + IfNotExists: yyS[yypt-2].item.(bool), + Name: yyS[yypt-1].item.(string), + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 149: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 150: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].item.(string)} + } + case 151: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].item.(string)} + } + case 152: + { + parser.yyVAL.item = []*ast.DatabaseOption{} + } + case 154: + { + parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} + } + case 155: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) + } + case 156: + { + stmt := yyS[yypt-5].item.(*ast.CreateTableStmt) + stmt.Table = yyS[yypt-6].item.(*ast.TableName) + stmt.IfNotExists = yyS[yypt-7].item.(bool) + stmt.Options = yyS[yypt-4].item.([]*ast.TableOption) + if yyS[yypt-3].item != nil { + stmt.Partition = yyS[yypt-3].item.(*ast.PartitionOptions) + } + stmt.OnDuplicate = yyS[yypt-2].item.(ast.OnDuplicateCreateTableSelectType) + stmt.Select = yyS[yypt-0].item.(*ast.CreateTableStmt).Select + parser.yyVAL.statement = stmt + } + case 157: + { + parser.yyVAL.statement = &ast.CreateTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + ReferTable: yyS[yypt-0].item.(*ast.TableName), + IfNotExists: yyS[yypt-2].item.(bool), + } + } + case 160: + { + parser.yyVAL.item = nil + } + case 161: + { + parser.yyVAL.item = nil + } + case 162: + { + parser.yyVAL.item = nil + } + case 163: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + parser.yyVAL.item = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + Expr: yyS[yypt-4].expr.(ast.ExprNode), + Definitions: defs, + } + } + case 164: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + parser.yyVAL.item = &ast.PartitionOptions{ + Tp: model.PartitionTypeRange, + ColumnNames: yyS[yypt-3].item.([]*ast.ColumnName), + Definitions: defs, + } + } + case 172: + { + parser.yyVAL.item = nil + } + case 173: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) + } + case 174: + { + parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} + } + case 175: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) + } + case 176: + { + partDef := &ast.PartitionDefinition{ + Name: model.NewCIStr(yyS[yypt-2].ident), + } + switch yyS[yypt-1].item.(type) { + case []ast.ExprNode: + partDef.LessThan = yyS[yypt-1].item.([]ast.ExprNode) + case ast.ExprNode: + partDef.LessThan = make([]ast.ExprNode, 1) + partDef.LessThan[0] = yyS[yypt-1].item.(ast.ExprNode) + } + + if comment, ok := yyS[yypt-0].item.(string); ok { + partDef.Comment = comment + } + parser.yyVAL.item = partDef + } + case 177: + { + parser.yyVAL.item = nil + } + case 178: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 179: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 180: + { + if yyS[yypt-1].item != nil { + parser.yyVAL.item = yyS[yypt-1].item + } else { + parser.yyVAL.item = yyS[yypt-0].item + } + } + case 181: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 182: + { + parser.yyVAL.item = nil + } + case 183: + { + parser.yyVAL.item = nil + } + case 184: + { + parser.yyVAL.item = nil + } + case 185: + { + parser.yyVAL.item = &ast.MaxValueExpr{} + } + case 186: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 187: + { + parser.yyVAL.item = ast.OnDuplicateCreateTableSelectError + } + case 188: + { + parser.yyVAL.item = ast.OnDuplicateCreateTableSelectIgnore + } + case 189: + { + parser.yyVAL.item = ast.OnDuplicateCreateTableSelectReplace + } + case 192: + { + parser.yyVAL.item = &ast.CreateTableStmt{} + } + case 193: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement} + } + case 194: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement} + } + case 195: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].expr} + } + case 196: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 197: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 198: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + selStmt := yyS[yypt-1].statement.(*ast.SelectStmt) + selStmt.SetText(string(parser.src[startOffset:])) + x := &ast.CreateViewStmt{ + OrReplace: yyS[yypt-9].item.(bool), + ViewName: yyS[yypt-4].item.(*ast.TableName), + Select: selStmt, + } + if yyS[yypt-3].item != nil { + x.Cols = yyS[yypt-3].item.([]model.CIStr) + } + parser.yyVAL.statement = x + } + case 199: + { + parser.yyVAL.item = false + } + case 200: + { + parser.yyVAL.item = true + } + case 201: + { + parser.yyVAL.item = "UNDEFINED" + } + case 202: + { + parser.yyVAL.item = strings.ToUpper(yyS[yypt-0].ident) + } + case 203: + { + parser.yyVAL.item = strings.ToUpper(yyS[yypt-0].ident) + } + case 204: + { + parser.yyVAL.item = strings.ToUpper(yyS[yypt-0].ident) + } + case 205: + { + parser.yyVAL.item = nil + } + case 206: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 207: + { + parser.yyVAL.item = "DEFINER" + } + case 208: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 209: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 210: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 211: + { + parser.yyVAL.item = nil + } + case 212: + { + parser.yyVAL.item = yyS[yypt-1].item.([]model.CIStr) + } + case 213: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 214: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 215: + { + parser.yyVAL.item = nil + } + case 216: + { + parser.yyVAL.item = yyS[yypt-2].ident + } + case 217: + { + parser.yyVAL.item = yyS[yypt-2].ident + } + case 218: + { + parser.yyVAL.statement = &ast.DoStmt{ + Exprs: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 219: + { + // Single Table + tn := yyS[yypt-4].item.(*ast.TableName) + tn.IndexHints = yyS[yypt-3].item.([]*ast.IndexHint) + join := &ast.Join{Left: &ast.TableSource{Source: tn}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: yyS[yypt-8].item.(mysql.PriorityEnum), + Quick: yyS[yypt-7].item.(bool), + IgnoreErr: yyS[yypt-6].item.(bool), + } + if yyS[yypt-2].item != nil { + x.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + x.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + x.Limit = yyS[yypt-0].item.(*ast.Limit) + } + + parser.yyVAL.statement = x + } + case 220: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-6].item.(mysql.PriorityEnum), + Quick: yyS[yypt-5].item.(bool), + IgnoreErr: yyS[yypt-4].item.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-7].item != nil { + x.TableHints = yyS[yypt-7].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 221: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + Quick: yyS[yypt-6].item.(bool), + IgnoreErr: yyS[yypt-5].item.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-8].item != nil { + x.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 223: + { + parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].item.(string)} + } + case 224: + { + parser.yyVAL.statement = &ast.DropIndexStmt{IfExists: yyS[yypt-3].item.(bool), IndexName: yyS[yypt-2].ident, Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 225: + { + parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName)} + } + case 226: + { + parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName)} + } + case 227: + { + parser.yyVAL.statement = &ast.DoStmt{} + } + case 228: + { + parser.yyVAL.statement = &ast.DropUserStmt{IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 229: + { + parser.yyVAL.statement = &ast.DropUserStmt{IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 230: + { + parser.yyVAL.statement = &ast.DropStatsStmt{Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 238: + { + parser.yyVAL.statement = nil + } + case 239: + { + parser.yyVAL.statement = &ast.TraceStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + } + } + case 243: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-0].item.(*ast.TableName), + }, + } + } + case 244: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + Column: yyS[yypt-0].item.(*ast.ColumnName), + }, + } + } + case 245: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + } + } + case 246: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + } + } + case 247: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + Analyze: true, + } + } + case 248: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) + } + case 250: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + } + case 251: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 252: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 253: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 254: + { + expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = true + parser.yyVAL.expr = yyS[yypt-0].expr + } else { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + } + case 255: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} + } + case 256: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} + } + case 257: + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 259: + { + parser.yyVAL.expr = &ast.MaxValueExpr{} + } + case 260: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 265: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 266: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 267: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 268: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 269: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 271: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 272: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 273: + { + expr := ast.NewValueExpr(yyS[yypt-0].item) + parser.yyVAL.item = []ast.ExprNode{expr} + } + case 274: + { + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 275: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 276: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.CompareSubqueryExpr{Op: yyS[yypt-2].item.(opcode.Op), L: yyS[yypt-3].expr, R: sq, All: yyS[yypt-1].item.(bool)} + } + case 277: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} + } + case 279: + { + parser.yyVAL.item = opcode.GE + } + case 280: + { + parser.yyVAL.item = opcode.GT + } + case 281: + { + parser.yyVAL.item = opcode.LE + } + case 282: + { + parser.yyVAL.item = opcode.LT + } + case 283: + { + parser.yyVAL.item = opcode.NE + } + case 284: + { + parser.yyVAL.item = opcode.NE + } + case 285: + { + parser.yyVAL.item = opcode.EQ + } + case 286: + { + parser.yyVAL.item = opcode.NullEQ + } + case 287: + { + parser.yyVAL.item = true + } + case 288: + { + parser.yyVAL.item = false + } + case 289: + { + parser.yyVAL.item = true + } + case 290: + { + parser.yyVAL.item = false + } + case 291: + { + parser.yyVAL.item = true + } + case 292: + { + parser.yyVAL.item = false + } + case 293: + { + parser.yyVAL.item = true + } + case 294: + { + parser.yyVAL.item = false + } + case 295: + { + parser.yyVAL.item = true + } + case 296: + { + parser.yyVAL.item = false + } + case 297: + { + parser.yyVAL.item = false + } + case 298: + { + parser.yyVAL.item = false + } + case 299: + { + parser.yyVAL.item = true + } + case 300: + { + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 301: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), Sel: sq} + } + case 302: + { + parser.yyVAL.expr = &ast.BetweenExpr{ + Expr: yyS[yypt-4].expr, + Left: yyS[yypt-2].expr, + Right: yyS[yypt-0].expr, + Not: !yyS[yypt-3].item.(bool), + } + } + case 303: + { + escape := yyS[yypt-0].item.(string) + if len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } else if len(escape) == 0 { + escape = "\\" + } + parser.yyVAL.expr = &ast.PatternLikeExpr{ + Expr: yyS[yypt-3].expr, + Pattern: yyS[yypt-1].expr, + Not: !yyS[yypt-2].item.(bool), + Escape: escape[0], + } + } + case 304: + { + parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 308: + { + parser.yyVAL.item = "\\" + } + case 309: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 310: + { + parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} + } + case 311: + { + wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 312: + { + wildCard := &ast.WildCardField{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 313: + { + expr := yyS[yypt-1].expr + asName := yyS[yypt-0].item.(string) + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + case 314: + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + expr := yyS[yypt-2].expr + asName := yyS[yypt-0].item.(string) + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} + } + case 315: + { + parser.yyVAL.item = "" + } + case 316: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 317: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 318: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 319: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 320: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 321: + { + field := yyS[yypt-0].item.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + parser.yyVAL.item = []*ast.SelectField{field} + } + case 322: + { + + fl := yyS[yypt-2].item.([]*ast.SelectField) + last := fl[len(fl)-1] + if last.Expr != nil && last.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-1]) + last.SetText(parser.src[last.Offset:lastEnd]) + } + newField := yyS[yypt-0].item.(*ast.SelectField) + newField.Offset = parser.startOffset(&yyS[yypt]) + parser.yyVAL.item = append(fl, newField) + } + case 323: + { + parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 324: + { + parser.yyVAL.item = nil + } + case 325: + { + parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} + } + case 326: + { + parser.yyVAL.item = false + } + case 327: + { + parser.yyVAL.item = true + } + case 328: + { + parser.yyVAL.item = false + } + case 329: + { + parser.yyVAL.item = true + } + case 330: + { + parser.yyVAL.item = false + } + case 331: + { + parser.yyVAL.item = true + } + case 332: + { + parser.yyVAL.item = "" + } + case 333: + { + //"index name" + parser.yyVAL.item = yyS[yypt-0].ident + } + case 334: + { + parser.yyVAL.item = nil + } + case 335: + { + // Merge the options + if yyS[yypt-1].item == nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + opt1 := yyS[yypt-1].item.(*ast.IndexOption) + opt2 := yyS[yypt-0].item.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } + parser.yyVAL.item = opt1 + } + } + case 336: + { + parser.yyVAL.item = &ast.IndexOption{ + // TODO bug should be fix here! + // KeyBlockSize: $1.(uint64), + } + } + case 337: + { + parser.yyVAL.item = &ast.IndexOption{ + Tp: yyS[yypt-0].item.(model.IndexType), + } + } + case 338: + { + parser.yyVAL.item = &ast.IndexOption{ + Comment: yyS[yypt-0].ident, + } + } + case 339: + { + parser.yyVAL.item = model.IndexTypeBtree + } + case 340: + { + parser.yyVAL.item = model.IndexTypeHash + } + case 341: + { + parser.yyVAL.item = nil + } + case 342: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 548: + { + x := yyS[yypt-1].item.(*ast.InsertStmt) + x.Priority = yyS[yypt-5].item.(mysql.PriorityEnum) + x.IgnoreErr = yyS[yypt-4].item.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: yyS[yypt-2].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if yyS[yypt-0].item != nil { + x.OnDuplicate = yyS[yypt-0].item.([]*ast.Assignment) + } + parser.yyVAL.statement = x + } + case 551: + { + parser.yyVAL.item = &ast.InsertStmt{ + Columns: yyS[yypt-3].item.([]*ast.ColumnName), + Lists: yyS[yypt-0].item.([][]ast.ExprNode), + } + } + case 552: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 553: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-4].item.([]*ast.ColumnName), Select: yyS[yypt-1].statement.(*ast.SelectStmt)} + } + case 554: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(*ast.UnionStmt)} + } + case 555: + { + parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} + } + case 556: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-1].statement.(*ast.SelectStmt)} + } + case 557: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 558: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(*ast.UnionStmt)} + } + case 559: + { + parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} + } + case 562: + { + parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} + } + case 563: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) + } + case 564: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 565: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 567: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 568: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 570: + { + parser.yyVAL.expr = &ast.DefaultExpr{} + } + case 571: + { + parser.yyVAL.item = &ast.Assignment{ + Column: yyS[yypt-2].item.(*ast.ColumnName), + Expr: yyS[yypt-0].expr, + } + } + case 572: + { + parser.yyVAL.item = []*ast.Assignment{} + } + case 573: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 574: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 575: + { + parser.yyVAL.item = nil + } + case 576: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 577: + { + x := yyS[yypt-0].item.(*ast.InsertStmt) + x.IsReplace = true + x.Priority = yyS[yypt-3].item.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: yyS[yypt-1].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + parser.yyVAL.statement = x + } + case 578: + { + parser.yyVAL.ident = ast.DateLiteral + } + case 579: + { + parser.yyVAL.ident = ast.TimeLiteral + } + case 580: + { + parser.yyVAL.ident = ast.TimestampLiteral + } + case 581: + { + parser.yyVAL.expr = ast.NewValueExpr(false) + } + case 582: + { + parser.yyVAL.expr = ast.NewValueExpr(nil) + } + case 583: + { + parser.yyVAL.expr = ast.NewValueExpr(true) + } + case 584: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 585: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 586: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 587: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 588: + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollation(yyS[yypt-1].ident) + if err != nil { + yylex.Errorf("Get collation error for charset: %s", yyS[yypt-1].ident) + return 1 + } + expr := ast.NewValueExpr(yyS[yypt-0].ident) + tp := expr.GetType() + tp.Charset = yyS[yypt-1].ident + tp.Collate = co + if tp.Collate == charset.CollationBin { + tp.Flag |= mysql.BinaryFlag + } + parser.yyVAL.expr = expr + } + case 589: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 590: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item) + } + case 591: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = expr + } + case 592: + { + valExpr := yyS[yypt-1].expr.(ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit + yyS[yypt-0].ident) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + parser.yyVAL.expr = expr + } + case 593: + { + parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 594: + { + parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} + } + case 595: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) + } + case 596: + { + expr := yyS[yypt-1].expr + valueExpr, ok := expr.(ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} + } + case 597: + { + parser.yyVAL.item = false // ASC by default + } + case 598: + { + parser.yyVAL.item = false + } + case 599: + { + parser.yyVAL.item = true + } + case 600: + { + parser.yyVAL.item = nil + } + case 601: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 602: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 603: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 604: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 605: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 606: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 607: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 608: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + ast.NewValueExpr(yyS[yypt-0].ident), + }, + } + } + case 609: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + ast.NewValueExpr(yyS[yypt-0].ident), + }, + } + } + case 610: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 611: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 612: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 613: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 614: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 615: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 617: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 618: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 619: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 620: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: model.NewCIStr(yyS[yypt-4].ident), + Table: model.NewCIStr(yyS[yypt-2].ident), + Name: model.NewCIStr(yyS[yypt-0].ident), + }} + } + case 625: + { + // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. + parser.yyVAL.expr = yyS[yypt-2].expr + } + case 627: + { + parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 630: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + case 631: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} + } + case 632: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} + } + case 633: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} + } + case 634: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} + } + case 635: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + case 637: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := yyS[yypt-1].expr + expr.SetText(parser.src[startOffset:endOffset]) + parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} + } + case 638: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 639: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 640: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.Exists = true + parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} + } + case 641: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + x := types.NewFieldType(mysql.TypeString) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-0].expr, + Tp: x, + FunctionType: ast.CastBinaryOperator, + } + } + case 642: + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastFunction, + } + } + case 643: + { + x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} + if yyS[yypt-3].expr != nil { + x.Value = yyS[yypt-3].expr + } + if yyS[yypt-1].item != nil { + x.ElseClause = yyS[yypt-1].item.(ast.ExprNode) + } + parser.yyVAL.expr = x + } + case 644: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.Tp) + if tp.Flen == types.UnspecifiedLength { + tp.Flen = defaultFlen + } + if tp.Decimal == types.UnspecifiedLength { + tp.Decimal = defaultDecimal + } + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastConvertFunction, + } + } + case 645: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr(yyS[yypt-1].item) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, + } + } + case 646: + { + parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} + } + case 647: + { + parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} + } + case 648: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + } + case 649: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + extract := &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + case 652: + { + parser.yyVAL.item = false + } + case 653: + { + parser.yyVAL.item = true + } + case 654: + { + parser.yyVAL.item = false + } + case 656: + { + parser.yyVAL.item = true + } + case 659: + { + parser.yyVAL.item = true + } + case 700: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 701: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 702: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} + } + case 703: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} + } + case 704: + { + args := []ast.ExprNode{} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} + } + case 705: + { + nilVal := ast.NewValueExpr(nil) + args := yyS[yypt-1].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } + case 706: + { + charset1 := ast.NewValueExpr(yyS[yypt-1].item) + args := yyS[yypt-3].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } + case 707: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } + case 708: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } + case 709: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } + case 710: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 711: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} + } + case 712: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 713: + { + // This is ODBC syntax for date and time literals. + // See: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html + expr := ast.NewValueExpr(yyS[yypt-1].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident), Args: []ast.ExprNode{expr}} + } + case 714: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 715: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 716: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ + yyS[yypt-3].expr, + yyS[yypt-1].expr, + ast.NewValueExpr("DAY"), + }, + } + } + case 717: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + ast.NewValueExpr(yyS[yypt-1].ident), + }, + } + } + case 718: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + ast.NewValueExpr(yyS[yypt-1].ident), + }, + } + } + case 719: + { + timeUnit := ast.NewValueExpr(yyS[yypt-3].ident) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, + } + } + case 720: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-3].ident), yyS[yypt-1].expr}, + } + } + case 721: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} + } + case 722: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 723: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 724: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 725: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 726: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-5].ident), yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 727: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-5].ident), yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 728: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-3].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr}, + } + } + case 729: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, + } + } + case 730: + { + nilVal := ast.NewValueExpr(nil) + direction := ast.NewValueExpr(int(yyS[yypt-3].item.(ast.TrimDirectionType))) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, nilVal, direction}, + } + } + case 731: + { + direction := ast.NewValueExpr(int(yyS[yypt-4].item.(ast.TrimDirectionType))) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: model.NewCIStr(yyS[yypt-6].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, + } + } + case 732: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 733: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 734: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 735: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 740: + { + parser.yyVAL.item = ast.TrimBoth + } + case 741: + { + parser.yyVAL.item = ast.TrimLeading + } + case 742: + { + parser.yyVAL.item = ast.TrimTrailing + } + case 743: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 744: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 745: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 746: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 747: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 748: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 749: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 750: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} + } + case 751: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 752: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}} + } + case 753: + { + args := []ast.ExprNode{ast.NewValueExpr(1)} + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: args} + } + case 754: + { + args := yyS[yypt-3].item.([]ast.ExprNode) + args = append(args, yyS[yypt-1].item.(ast.ExprNode)) + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: args, Distinct: yyS[yypt-4].item.(bool)} + } + case 755: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 756: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 757: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-1].expr}, Distinct: yyS[yypt-2].item.(bool)} + } + case 758: + { + parser.yyVAL.item = ast.NewValueExpr(",") + } + case 759: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident) + } + case 760: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 761: + { + parser.yyVAL.item = nil + } + case 762: + { + parser.yyVAL.item = nil + } + case 763: + { + expr := ast.NewValueExpr(yyS[yypt-1].item) + parser.yyVAL.item = expr + } + case 764: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 765: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 766: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 767: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 768: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 769: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 770: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 771: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 772: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 773: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 774: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 775: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 776: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 777: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 778: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 779: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 780: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 781: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 782: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 783: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 784: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 785: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 786: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 787: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 788: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 789: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 790: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 791: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 792: + { + parser.yyVAL.ident = strings.ToUpper(yyS[yypt-0].ident) + } + case 793: + { + parser.yyVAL.expr = nil + } + case 794: + { + parser.yyVAL.expr = yyS[yypt-0].expr + } + case 795: + { + parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} + } + case 796: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) + } + case 797: + { + parser.yyVAL.item = &ast.WhenClause{ + Expr: yyS[yypt-2].expr, + Result: yyS[yypt-0].expr, + } + } + case 798: + { + parser.yyVAL.item = nil + } + case 799: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 800: + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = yyS[yypt-0].item.(int) // TODO: Flen should be the flen of expression + if x.Flen != types.UnspecifiedLength { + x.Tp = mysql.TypeString + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 801: + { + x := types.NewFieldType(mysql.TypeVarString) + x.Flen = yyS[yypt-1].item.(int) // TODO: Flen should be the flen of expression + x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + if x.Charset == "" { + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + } + parser.yyVAL.item = x + } + case 802: + { + x := types.NewFieldType(mysql.TypeDate) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 803: + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 804: + { + fopt := yyS[yypt-0].item.(*ast.FloatOpt) + x := types.NewFieldType(mysql.TypeNewDecimal) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 805: + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 806: + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 807: + { + x := types.NewFieldType(mysql.TypeLonglong) + x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 808: + { + x := types.NewFieldType(mysql.TypeJSON) + x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) + x.Charset = charset.CharsetUTF8 + x.Collate = charset.CollationUTF8 + parser.yyVAL.item = x + } + case 809: + { + parser.yyVAL.item = mysql.NoPriority + } + case 810: + { + parser.yyVAL.item = mysql.LowPriority + } + case 811: + { + parser.yyVAL.item = mysql.HighPriority + } + case 812: + { + parser.yyVAL.item = mysql.DelayedPriority + } + case 813: + { + parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 814: + { + parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} + } + case 815: + { + tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} + parser.yyVAL.item = tbl + } + case 816: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) + } + case 817: + { + parser.yyVAL.item = false + } + case 818: + { + parser.yyVAL.item = true + } + case 819: + { + var sqlText string + var sqlVar *ast.VariableExpr + switch yyS[yypt-0].item.(type) { + case string: + sqlText = yyS[yypt-0].item.(string) + case *ast.VariableExpr: + sqlVar = yyS[yypt-0].item.(*ast.VariableExpr) + } + parser.yyVAL.statement = &ast.PrepareStmt{ + Name: yyS[yypt-2].ident, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + case 820: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 821: + { + parser.yyVAL.item = yyS[yypt-0].expr.(interface{}) + } + case 822: + { + parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} + } + case 823: + { + parser.yyVAL.statement = &ast.ExecuteStmt{ + Name: yyS[yypt-2].ident, + UsingVars: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 824: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 825: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 826: + { + parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} + } + case 829: + { + parser.yyVAL.statement = &ast.RollbackStmt{} + } + case 830: + { + st := &ast.SelectStmt{ + SelectStmtOpts: yyS[yypt-1].item.(*ast.SelectStmtOpts), + Distinct: yyS[yypt-1].item.(*ast.SelectStmtOpts).Distinct, + Fields: yyS[yypt-0].item.(*ast.FieldList), + } + parser.yyVAL.item = st + } + case 831: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-2].offset - 1 + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-1].item != nil { + st.Where = yyS[yypt-1].item.(ast.ExprNode) + } + + if yyS[yypt-0].item != nil { + st.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) + } + } + case 832: + { + st := yyS[yypt-5].item.(*ast.SelectStmt) + st.From = yyS[yypt-3].item.(*ast.TableRefsClause) + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-4]) + lastField.SetText(parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-2].item != nil { + st.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + st.GroupBy = yyS[yypt-1].item.(*ast.GroupByClause) + } + if yyS[yypt-0].item != nil { + st.Having = yyS[yypt-0].item.(*ast.HavingClause) + } + parser.yyVAL.item = st + } + case 833: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + src := parser.src + var lastEnd int + if yyS[yypt-2].item != nil { + lastEnd = yyS[yypt-2].offset - 1 + } else if yyS[yypt-1].item != nil { + lastEnd = yyS[yypt-1].offset - 1 + } else if yyS[yypt-0].item != ast.SelectLockNone { + lastEnd = yyS[yypt].offset - 1 + } else { + lastEnd = len(src) + if src[lastEnd-1] == ';' { + lastEnd-- + } + } + lastField.SetText(src[lastField.Offset:lastEnd]) + } + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 834: + { + st := yyS[yypt-2].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 835: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + if yyS[yypt-2].item != nil { + st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + st.Limit = yyS[yypt-1].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 837: + { + parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} + } + case 838: + { + if j, ok := yyS[yypt-0].item.(*ast.Join); ok { + // if $1 is Join, use it directly + parser.yyVAL.item = j + } else { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} + } + } + case 839: + { + /* from a, b is default cross join */ + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 840: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 841: + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + parser.yyVAL.item = yyS[yypt-1].item + } + case 842: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 843: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 844: + { + tn := yyS[yypt-2].item.(*ast.TableName) + tn.IndexHints = yyS[yypt-0].item.([]*ast.IndexHint) + parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-1].item.(model.CIStr)} + } + case 845: + { + st := yyS[yypt-2].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(st, endOffset) + parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.SelectStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + } + case 846: + { + parser.yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].statement.(*ast.UnionStmt), AsName: yyS[yypt-0].item.(model.CIStr)} + } + case 847: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 848: + { + parser.yyVAL.item = model.CIStr{} + } + case 849: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 850: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 851: + { + parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) + } + case 852: + { + parser.yyVAL.item = ast.HintUse + } + case 853: + { + parser.yyVAL.item = ast.HintIgnore + } + case 854: + { + parser.yyVAL.item = ast.HintForce + } + case 855: + { + parser.yyVAL.item = ast.HintForScan + } + case 856: + { + parser.yyVAL.item = ast.HintForJoin + } + case 857: + { + parser.yyVAL.item = ast.HintForOrderBy + } + case 858: + { + parser.yyVAL.item = ast.HintForGroupBy + } + case 859: + { + parser.yyVAL.item = &ast.IndexHint{ + IndexNames: yyS[yypt-1].item.([]model.CIStr), + HintType: yyS[yypt-4].item.(ast.IndexHintType), + HintScope: yyS[yypt-3].item.(ast.IndexHintScope), + } + } + case 860: + { + var nameList []model.CIStr + parser.yyVAL.item = nameList + } + case 861: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 862: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 863: + { + parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} + } + case 864: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) + } + case 865: + { + var hintList []*ast.IndexHint + parser.yyVAL.item = hintList + } + case 866: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 867: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 868: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } + case 869: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 870: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: yyS[yypt-5].item.(ast.JoinType), On: on} + } + case 871: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-8].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: yyS[yypt-7].item.(ast.JoinType), Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 872: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} + } + case 873: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: yyS[yypt-3].item.(ast.JoinType), NaturalJoin: true} + } + case 874: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} + } + case 875: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), StraightJoin: true, On: on} + } + case 876: + { + parser.yyVAL.item = ast.LeftJoin + } + case 877: + { + parser.yyVAL.item = ast.RightJoin + } + case 883: + { + parser.yyVAL.item = nil + } + case 884: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} + } + case 885: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item) + } + case 886: + { + parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 887: + { + parser.yyVAL.item = nil + } + case 888: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 889: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 890: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} + } + case 891: + { + opt := &ast.SelectStmtOpts{} + if yyS[yypt-5].item != nil { + opt.TableHints = yyS[yypt-5].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-4].item != nil { + opt.Distinct = yyS[yypt-4].item.(bool) + } + if yyS[yypt-3].item != nil { + opt.Priority = yyS[yypt-3].item.(mysql.PriorityEnum) + } + if yyS[yypt-2].item != nil { + opt.SQLCache = yyS[yypt-2].item.(bool) + } + if yyS[yypt-1].item != nil { + opt.CalcFoundRows = yyS[yypt-1].item.(bool) + } + if yyS[yypt-0].item != nil { + opt.StraightJoin = yyS[yypt-0].item.(bool) + } + + parser.yyVAL.item = opt + } + case 892: + { + parser.yyVAL.item = nil + } + case 893: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 894: + { + parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} + } + case 895: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) + } + case 896: + { + parser.yyVAL.item = []*ast.TableOptimizerHint{yyS[yypt-0].item.(*ast.TableOptimizerHint)} + } + case 897: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOptimizerHint), yyS[yypt-0].item.(*ast.TableOptimizerHint)) + } + case 898: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} + } + case 899: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} + } + case 900: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), Tables: yyS[yypt-1].item.([]model.CIStr)} + } + case 901: + { + parser.yyVAL.item = &ast.TableOptimizerHint{HintName: model.NewCIStr(yyS[yypt-3].ident), MaxExecutionTime: getUint64FromNUM(yyS[yypt-1].item)} + } + case 902: + { + parser.yyVAL.item = false + } + case 903: + { + parser.yyVAL.item = true + } + case 904: + { + parser.yyVAL.item = true + } + case 905: + { + parser.yyVAL.item = true + } + case 906: + { + parser.yyVAL.item = false + } + case 907: + { + parser.yyVAL.item = false + } + case 908: + { + parser.yyVAL.item = true + } + case 909: + { + parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} + } + case 910: + { + parser.yyVAL.item = nil + } + case 912: + { + s := yyS[yypt-1].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(s, endOffset) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} + } + case 913: + { + s := yyS[yypt-1].statement.(*ast.UnionStmt) + src := parser.src + // See the implementation of yyParse function + s.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: s} + } + case 914: + { + parser.yyVAL.item = ast.SelectLockNone + } + case 915: + { + parser.yyVAL.item = ast.SelectLockForUpdate + } + case 916: + { + parser.yyVAL.item = ast.SelectLockInShareMode + } + case 917: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 918: + { + st := yyS[yypt-2].item.(*ast.SelectStmt) + union := yyS[yypt-5].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-3].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-4]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } else { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 919: + { + st := yyS[yypt-3].item.(*ast.SelectStmt) + union := yyS[yypt-6].item.(*ast.UnionStmt) + st.IsAfterUnionDistinct = yyS[yypt-4].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-5]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-2].item != nil { + union.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) + } + if yyS[yypt-1].item != nil { + union.Limit = yyS[yypt-1].item.(*ast.Limit) + } + if yyS[yypt-2].item == nil && yyS[yypt-1].item == nil { + st.LockTp = yyS[yypt-0].item.(ast.SelectLockType) + } + parser.yyVAL.statement = union + } + case 920: + { + union := yyS[yypt-7].item.(*ast.UnionStmt) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-6]) + parser.setLastSelectFieldText(lastSelect, endOffset) + st := yyS[yypt-3].statement.(*ast.SelectStmt) + st.IsInBraces = true + st.IsAfterUnionDistinct = yyS[yypt-5].item.(bool) + endOffset = parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(st, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + if yyS[yypt-1].item != nil { + union.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + union.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = union + } + case 921: + { + selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{yyS[yypt-0].item.(*ast.SelectStmt)}} + parser.yyVAL.item = &ast.UnionStmt{ + SelectList: selectList, + } + } + case 922: + { + union := yyS[yypt-3].item.(*ast.UnionStmt) + st := yyS[yypt-0].item.(*ast.SelectStmt) + st.IsAfterUnionDistinct = yyS[yypt-1].item.(bool) + lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(lastSelect, endOffset) + union.SelectList.Selects = append(union.SelectList.Selects, st) + parser.yyVAL.item = union + } + case 923: + { + parser.yyVAL.item = yyS[yypt-0].statement.(interface{}) + } + case 924: + { + st := yyS[yypt-1].statement.(*ast.SelectStmt) + st.IsInBraces = true + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(st, endOffset) + parser.yyVAL.item = yyS[yypt-1].statement + } + case 926: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 927: + { + parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].item.(string)} + } + case 928: + { + parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].item.(string)} + } + case 929: + { + vars := yyS[yypt-0].item.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + parser.yyVAL.statement = &ast.SetStmt{Variables: vars} + } + case 930: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 931: + { + assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + for i := 0; i < len(assigns); i++ { + if assigns[i].Name == "tx_isolation" { + // A special session variable that make setting tx_isolation take effect one time. + assigns[i].Name = "tx_isolation_one_shot" + } + } + parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} + } + case 932: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + } + case 933: + { + if yyS[yypt-0].item != nil { + varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), varAssigns...) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 934: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr(yyS[yypt-0].ident) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 935: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("0") + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 936: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("1") + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 937: + { + parser.yyVAL.ident = ast.RepeatableRead + } + case 938: + { + parser.yyVAL.ident = ast.ReadCommitted + } + case 939: + { + parser.yyVAL.ident = ast.ReadUncommitted + } + case 940: + { + parser.yyVAL.ident = ast.Serializable + } + case 941: + { + parser.yyVAL.expr = ast.NewValueExpr("ON") + } + case 943: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 944: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} + } + case 945: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 946: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 947: + { + v := strings.ToLower(yyS[yypt-2].ident) + var isGlobal bool + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v = strings.TrimPrefix(v, "@@") + } + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} + } + case 948: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} + } + case 949: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} + } + case 950: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 951: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), + } + } + case 952: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].item.(string)), + ExtendValue: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 953: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].item.(string)), + } + } + case 954: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 955: + { + parser.yyVAL.item = charset.CharsetBin + } + case 956: + { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + case 957: + { + parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} + } + case 958: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) + } + case 961: + { + v := strings.ToLower(yyS[yypt-0].ident) + var isGlobal bool + explicitScope := true + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v, explicitScope = strings.TrimPrefix(v, "@@"), false + } + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} + } + case 962: + { + v := yyS[yypt-0].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} + } + case 963: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].item.(string), Hostname: "%"} + } + case 964: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].item.(string), Hostname: yyS[yypt-0].item.(string)} + } + case 965: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].item.(string), Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} + } + case 966: + { + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + } + case 967: + { + parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} + } + case 968: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) + } + case 969: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 970: + { + parser.yyVAL.item = yyS[yypt-1].item.(string) + } + case 971: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 972: + { + parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} + } + case 973: + { + parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} + } + case 974: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobs, + JobNumber: yyS[yypt-0].item.(int64), + } + } + case 975: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckTable, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 976: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 977: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminRecoverIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 978: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCleanupIndex, + Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, + Index: string(yyS[yypt-0].ident), + } + } + case 979: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCheckIndexRange, + Tables: []*ast.TableName{yyS[yypt-2].item.(*ast.TableName)}, + Index: string(yyS[yypt-1].ident), + HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), + } + } + case 980: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminChecksumTable, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 981: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminCancelDDLJobs, + JobIDs: yyS[yypt-0].item.([]int64), + } + } + case 982: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowDDLJobQueries, + JobIDs: yyS[yypt-0].item.([]int64), + } + } + case 983: + { + parser.yyVAL.statement = &ast.AdminStmt{ + Tp: ast.AdminShowSlow, + ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), + } + } + case 984: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowRecent, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 985: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindDefault, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 986: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindInternal, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 987: + { + parser.yyVAL.item = &ast.ShowSlow{ + Tp: ast.ShowSlowTop, + Kind: ast.ShowSlowKindAll, + Count: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 988: + { + parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} + } + case 989: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) + } + case 990: + { + parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} + } + case 991: + { + parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} + } + case 992: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) + } + case 993: + { + stmt := yyS[yypt-1].item.(*ast.ShowStmt) + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 994: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateTable, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 995: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateDatabase, + DBName: yyS[yypt-0].item.(string), + } + } + case 996: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} + } + case 997: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: yyS[yypt-0].item.(*auth.UserIdentity), + } + } + case 998: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowMasterStatus, + } + } + case 999: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProcessList, + Full: yyS[yypt-1].item.(bool), + } + } + case 1000: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsMeta, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1001: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsHistograms, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1002: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsBuckets, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1003: + { + stmt := &ast.ShowStmt{ + Tp: ast.ShowStatsHealthy, + } + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1004: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProfiles, + } + } + case 1005: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowPrivileges, + } + } + case 1011: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} + } + case 1012: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} + } + case 1013: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} + } + case 1014: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTables, + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-2].item.(bool), + } + } + case 1015: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTableStatus, + DBName: yyS[yypt-0].item.(string), + } + } + case 1016: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1017: + { + show := &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: &ast.TableName{Name: model.NewCIStr(yyS[yypt-2].ident), Schema: model.NewCIStr(yyS[yypt-0].ident)}, + } + parser.yyVAL.item = show + } + case 1018: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-3].item.(bool), + } + } + case 1019: + { + // SHOW FIELDS is a synonym for SHOW COLUMNS. + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].item.(string), + Full: yyS[yypt-3].item.(bool), + } + } + case 1020: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} + } + case 1021: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} + } + case 1022: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowVariables, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1023: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowStatus, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1024: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowCollation, + } + } + case 1025: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTriggers, + DBName: yyS[yypt-0].item.(string), + } + } + case 1026: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowProcedureStatus, + } + } + case 1027: + { + // This statement is similar to SHOW PROCEDURE STATUS but for stored functions. + // See http://dev.mysql.com/doc/refman/5.7/en/show-function-status.html + // We do not support neither stored functions nor stored procedures. + // So we reuse show procedure status process logic. + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowProcedureStatus, + } + } + case 1028: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowEvents, + DBName: yyS[yypt-0].item.(string), + } + } + case 1029: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowPlugins, + } + } + case 1030: + { + parser.yyVAL.item = nil + } + case 1031: + { + parser.yyVAL.item = &ast.PatternLikeExpr{ + Pattern: yyS[yypt-0].expr, + Escape: '\\', + } + } + case 1032: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1033: + { + parser.yyVAL.item = false + } + case 1034: + { + parser.yyVAL.item = true + } + case 1035: + { + parser.yyVAL.item = false + } + case 1036: + { + parser.yyVAL.item = false + } + case 1037: + { + parser.yyVAL.item = true + } + case 1038: + { + parser.yyVAL.item = "" + } + case 1039: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1040: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 1041: + { + tmp := yyS[yypt-0].item.(*ast.FlushStmt) + tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) + parser.yyVAL.statement = tmp + } + case 1042: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushPrivileges, + } + } + case 1043: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushStatus, + } + } + case 1044: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushTables, + Tables: yyS[yypt-1].item.([]*ast.TableName), + ReadLock: yyS[yypt-0].item.(bool), + } + } + case 1045: + { + parser.yyVAL.item = false + } + case 1046: + { + parser.yyVAL.item = true + } + case 1047: + { + parser.yyVAL.item = true + } + case 1048: + { + parser.yyVAL.item = []*ast.TableName{} + } + case 1049: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1050: + { + parser.yyVAL.item = false + } + case 1051: + { + parser.yyVAL.item = true + } + case 1091: + { + // `(select 1)`; is a valid select statement + // TODO: This is used to fix issue #320. There may be a better solution. + parser.yyVAL.statement = yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(ast.StmtNode) + } + case 1110: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + s.SetText(lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1111: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + s.SetText(lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1112: + { + cst := yyS[yypt-0].item.(*ast.Constraint) + if yyS[yypt-1].item != nil { + cst.Name = yyS[yypt-1].item.(string) + } + parser.yyVAL.item = cst + } + case 1113: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.ColumnDef) + } + case 1114: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.Constraint) + } + case 1115: + { + /* Nothing to do now */ + parser.yyVAL.item = nil + } + case 1116: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} + } else { + parser.yyVAL.item = []interface{}{} + } + } + case 1117: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 1118: + { + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1119: + { + tes := yyS[yypt-1].item.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1120: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} + } + case 1121: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} + } + case 1122: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].item.(string)} + } + case 1123: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)} + } + case 1124: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1125: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} + } + case 1126: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1127: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} + } + case 1128: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1129: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} + } + case 1130: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} + } + case 1131: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1132: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1133: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1134: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1135: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1136: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} + } + case 1137: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1138: + { + // Parse it but will ignore it. + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPackKeys} + } + case 1141: + { + parser.yyVAL.item = []*ast.TableOption{} + } + case 1143: + { + parser.yyVAL.item = []*ast.TableOption{} + } + case 1145: + { + parser.yyVAL.item = []*ast.TableOption{yyS[yypt-0].item.(*ast.TableOption)} + } + case 1146: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) + } + case 1147: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) + } + case 1150: + { + parser.yyVAL.statement = &ast.TruncateTableStmt{Table: yyS[yypt-0].item.(*ast.TableName)} + } + case 1151: + { + parser.yyVAL.item = ast.RowFormatDefault + } + case 1152: + { + parser.yyVAL.item = ast.RowFormatDynamic + } + case 1153: + { + parser.yyVAL.item = ast.RowFormatFixed + } + case 1154: + { + parser.yyVAL.item = ast.RowFormatCompressed + } + case 1155: + { + parser.yyVAL.item = ast.RowFormatRedundant + } + case 1156: + { + parser.yyVAL.item = ast.RowFormatCompact + } + case 1157: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1158: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1159: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1160: + { + // TODO: check flen 0 + x := types.NewFieldType(yyS[yypt-2].item.(byte)) + x.Flen = yyS[yypt-1].item.(int) + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1161: + { + // TODO: check flen 0 + x := types.NewFieldType(yyS[yypt-1].item.(byte)) + x.Flen = 1 + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1162: + { + fopt := yyS[yypt-1].item.(*ast.FloatOpt) + x := types.NewFieldType(yyS[yypt-2].item.(byte)) + x.Flen = fopt.Flen + x.Decimal = fopt.Decimal + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1163: + { + fopt := yyS[yypt-1].item.(*ast.FloatOpt) + x := types.NewFieldType(yyS[yypt-2].item.(byte)) + x.Flen = fopt.Flen + if x.Tp == mysql.TypeFloat { + if x.Flen > 24 { + x.Tp = mysql.TypeDouble + } + } + x.Decimal = fopt.Decimal + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + x.Flag |= mysql.UnsignedFlag + } + if o.IsZerofill { + x.Flag |= mysql.ZerofillFlag + } + } + parser.yyVAL.item = x + } + case 1164: + { + x := types.NewFieldType(yyS[yypt-1].item.(byte)) + x.Flen = yyS[yypt-0].item.(int) + if x.Flen == types.UnspecifiedLength || x.Flen == 0 { + x.Flen = 1 + } else if x.Flen > 64 { + yylex.Errorf("invalid field length %d for bit type, must in [1, 64]", x.Flen) + } + parser.yyVAL.item = x + } + case 1165: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1166: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1167: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1168: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1169: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1170: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1171: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1172: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1173: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1174: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1175: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1176: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1177: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1181: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1182: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1183: + { + parser.yyVAL.item = mysql.TypeFloat + } + case 1184: + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + parser.yyVAL.item = mysql.TypeFloat + } else { + parser.yyVAL.item = mysql.TypeDouble + } + } + case 1185: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1186: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1187: + { + parser.yyVAL.item = mysql.TypeBit + } + case 1188: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-2].item.(int) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1189: + { + x := types.NewFieldType(mysql.TypeString) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1190: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-2].item.(int) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1191: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-2].item.(int) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1192: + { + x := types.NewFieldType(mysql.TypeString) + x.Flen = yyS[yypt-0].item.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1193: + { + x := types.NewFieldType(mysql.TypeVarchar) + x.Flen = yyS[yypt-0].item.(int) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = x + } + case 1194: + { + x := yyS[yypt-0].item.(*types.FieldType) + x.Charset = charset.CharsetBin + x.Collate = charset.CharsetBin + x.Flag |= mysql.BinaryFlag + parser.yyVAL.item = yyS[yypt-0].item.(*types.FieldType) + } + case 1195: + { + x := yyS[yypt-2].item.(*types.FieldType) + x.Charset = yyS[yypt-1].item.(*ast.OptBinary).Charset + x.Collate = yyS[yypt-0].item.(string) + if yyS[yypt-1].item.(*ast.OptBinary).IsBinary { + x.Flag |= mysql.BinaryFlag + } + parser.yyVAL.item = x + } + case 1196: + { + x := types.NewFieldType(mysql.TypeEnum) + x.Elems = yyS[yypt-3].item.([]string) + x.Charset = yyS[yypt-1].item.(string) + x.Collate = yyS[yypt-0].item.(string) + parser.yyVAL.item = x + } + case 1197: + { + x := types.NewFieldType(mysql.TypeSet) + x.Elems = yyS[yypt-3].item.([]string) + x.Charset = yyS[yypt-1].item.(string) + x.Collate = yyS[yypt-0].item.(string) + parser.yyVAL.item = x + } + case 1198: + { + x := types.NewFieldType(mysql.TypeJSON) + x.Decimal = 0 + x.Charset = charset.CharsetBin + x.Collate = charset.CollationBin + parser.yyVAL.item = x + } + case 1204: + { + x := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = x + } + case 1205: + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = yyS[yypt-0].item.(int) + parser.yyVAL.item = x + } + case 1206: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1207: + { + x := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = x + } + case 1208: + { + x := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = x + + } + case 1209: + { + x := types.NewFieldType(mysql.TypeBlob) + x.Flen = yyS[yypt-0].item.(int) + parser.yyVAL.item = x + } + case 1210: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1211: + { + x := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = x + } + case 1212: + { + x := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = x + } + case 1213: + { + x := types.NewFieldType(mysql.TypeDate) + parser.yyVAL.item = x + } + case 1214: + { + x := types.NewFieldType(mysql.TypeDatetime) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1215: + { + x := types.NewFieldType(mysql.TypeTimestamp) + x.Flen = mysql.MaxDatetimeWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1216: + { + x := types.NewFieldType(mysql.TypeDuration) + x.Flen = mysql.MaxDurationWidthNoFsp + x.Decimal = yyS[yypt-0].item.(int) + if x.Decimal > 0 { + x.Flen = x.Flen + 1 + x.Decimal + } + parser.yyVAL.item = x + } + case 1217: + { + x := types.NewFieldType(mysql.TypeYear) + x.Flen = yyS[yypt-1].item.(int) + if x.Flen != types.UnspecifiedLength && x.Flen != 4 { + yylex.Errorf("Supports only YEAR or YEAR(4) column.") + return -1 + } + parser.yyVAL.item = x + } + case 1218: + { + parser.yyVAL.item = int(yyS[yypt-1].item.(uint64)) + } + case 1219: + { + parser.yyVAL.item = types.UnspecifiedLength + } + case 1220: + { + parser.yyVAL.item = yyS[yypt-0].item.(int) + } + case 1221: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: true} + } + case 1222: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: false} + } + case 1223: + { + parser.yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + case 1224: + { + parser.yyVAL.item = []*ast.TypeOpt{} + } + case 1225: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) + } + case 1226: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } + case 1227: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} + } + case 1228: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.FloatOpt) + } + case 1229: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} + } + case 1230: + { + parser.yyVAL.item = false + } + case 1231: + { + parser.yyVAL.item = true + } + case 1232: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } + case 1233: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: true, + Charset: yyS[yypt-0].item.(string), + } + } + case 1234: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: yyS[yypt-0].item.(bool), + Charset: yyS[yypt-1].item.(string), + } + } + case 1235: + { + parser.yyVAL.item = "" + } + case 1236: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1239: + { + parser.yyVAL.item = "" + } + case 1240: + { + parser.yyVAL.item = yyS[yypt-0].item.(string) + } + case 1241: + { + parser.yyVAL.item = []string{yyS[yypt-0].ident} + } + case 1242: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) + } + case 1243: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1244: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1245: + { + var refs *ast.Join + if x, ok := yyS[yypt-5].item.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: yyS[yypt-3].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-6].item.(bool), + } + if yyS[yypt-8].item != nil { + st.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-2].item != nil { + st.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + st.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + st.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 1246: + { + st := &ast.UpdateStmt{ + Priority: yyS[yypt-5].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-3].item.(*ast.Join)}, + List: yyS[yypt-1].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-4].item.(bool), + } + if yyS[yypt-6].item != nil { + st.TableHints = yyS[yypt-6].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + st.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = st + } + case 1247: + { + parser.yyVAL.statement = &ast.UseStmt{DBName: yyS[yypt-0].item.(string)} + } + case 1248: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1249: + { + parser.yyVAL.item = nil + } + case 1250: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1253: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html + parser.yyVAL.statement = &ast.CreateUserStmt{ + IfNotExists: yyS[yypt-1].item.(bool), + Specs: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1254: + { + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-1].item.(bool), + Specs: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1255: + { + auth := &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-6].item.(bool), + CurrentAuth: auth, + } + } + case 1256: + { + userSpec := &ast.UserSpec{ + User: yyS[yypt-1].item.(*auth.UserIdentity), + } + if yyS[yypt-0].item != nil { + userSpec.AuthOpt = yyS[yypt-0].item.(*ast.AuthOption) + } + parser.yyVAL.item = userSpec + } + case 1257: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1258: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1259: + { + parser.yyVAL.item = nil + } + case 1260: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + } + case 1261: + { + parser.yyVAL.item = nil + } + case 1262: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].item.(string), + ByAuthString: true, + } + } + case 1263: + { + parser.yyVAL.item = &ast.AuthOption{ + HashString: yyS[yypt-0].item.(string), + } + } + case 1264: + { + parser.yyVAL.item = &ast.AuthOption{ + HashString: yyS[yypt-0].item.(string), + } + } + case 1265: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1266: + { + parser.yyVAL.statement = &ast.GrantStmt{ + Privs: yyS[yypt-6].item.([]*ast.PrivElem), + ObjectType: yyS[yypt-4].item.(ast.ObjectTypeType), + Level: yyS[yypt-3].item.(*ast.GrantLevel), + Users: yyS[yypt-1].item.([]*ast.UserSpec), + WithGrant: yyS[yypt-0].item.(bool), + } + } + case 1267: + { + parser.yyVAL.item = false + } + case 1268: + { + parser.yyVAL.item = true + } + case 1269: + { + parser.yyVAL.item = false + } + case 1270: + { + parser.yyVAL.item = false + } + case 1271: + { + parser.yyVAL.item = false + } + case 1272: + { + parser.yyVAL.item = false + } + case 1273: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-0].item.(mysql.PrivilegeType), + } + } + case 1274: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-3].item.(mysql.PrivilegeType), + Cols: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 1275: + { + parser.yyVAL.item = []*ast.PrivElem{yyS[yypt-0].item.(*ast.PrivElem)} + } + case 1276: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PrivElem), yyS[yypt-0].item.(*ast.PrivElem)) + } + case 1277: + { + parser.yyVAL.item = mysql.AllPriv + } + case 1278: + { + parser.yyVAL.item = mysql.AllPriv + } + case 1279: + { + parser.yyVAL.item = mysql.AlterPriv + } + case 1280: + { + parser.yyVAL.item = mysql.CreatePriv + } + case 1281: + { + parser.yyVAL.item = mysql.CreateUserPriv + } + case 1282: + { + parser.yyVAL.item = mysql.TriggerPriv + } + case 1283: + { + parser.yyVAL.item = mysql.DeletePriv + } + case 1284: + { + parser.yyVAL.item = mysql.DropPriv + } + case 1285: + { + parser.yyVAL.item = mysql.ProcessPriv + } + case 1286: + { + parser.yyVAL.item = mysql.ExecutePriv + } + case 1287: + { + parser.yyVAL.item = mysql.IndexPriv + } + case 1288: + { + parser.yyVAL.item = mysql.InsertPriv + } + case 1289: + { + parser.yyVAL.item = mysql.SelectPriv + } + case 1290: + { + parser.yyVAL.item = mysql.SuperPriv + } + case 1291: + { + parser.yyVAL.item = mysql.ShowDBPriv + } + case 1292: + { + parser.yyVAL.item = mysql.UpdatePriv + } + case 1293: + { + parser.yyVAL.item = mysql.GrantPriv + } + case 1294: + { + parser.yyVAL.item = mysql.ReferencesPriv + } + case 1295: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1296: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1297: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1298: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1299: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1300: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1301: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1302: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1303: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1304: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1305: + { + parser.yyVAL.item = mysql.PrivilegeType(0) + } + case 1306: + { + parser.yyVAL.item = ast.ObjectTypeNone + } + case 1307: + { + parser.yyVAL.item = ast.ObjectTypeTable + } + case 1308: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + } + } + case 1309: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelGlobal, + } + } + case 1310: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + DBName: yyS[yypt-2].ident, + } + } + case 1311: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + DBName: yyS[yypt-2].ident, + TableName: yyS[yypt-0].ident, + } + } + case 1312: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + TableName: yyS[yypt-0].ident, + } + } + case 1313: + { + parser.yyVAL.statement = &ast.RevokeStmt{ + Privs: yyS[yypt-5].item.([]*ast.PrivElem), + ObjectType: yyS[yypt-3].item.(ast.ObjectTypeType), + Level: yyS[yypt-2].item.(*ast.GrantLevel), + Users: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1314: + { + x := &ast.LoadDataStmt{ + Path: yyS[yypt-8].ident, + Table: yyS[yypt-5].item.(*ast.TableName), + Columns: yyS[yypt-0].item.([]*ast.ColumnName), + IgnoreLines: yyS[yypt-1].item.(uint64), + } + if yyS[yypt-10].item != nil { + x.IsLocal = true + } + if yyS[yypt-3].item != nil { + x.FieldsInfo = yyS[yypt-3].item.(*ast.FieldsClause) + } + if yyS[yypt-2].item != nil { + x.LinesInfo = yyS[yypt-2].item.(*ast.LinesClause) + } + parser.yyVAL.statement = x + } + case 1315: + { + parser.yyVAL.item = uint64(0) + } + case 1316: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) + } + case 1319: + { + parser.yyVAL.item = nil + } + case 1320: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1321: + { + escape := "\\" + parser.yyVAL.item = &ast.FieldsClause{ + Terminated: "\t", + Escaped: escape[0], + } + } + case 1322: + { + escape := yyS[yypt-0].item.(string) + if escape != "\\" && len(escape) > 1 { + yylex.Errorf("Incorrect arguments %s to ESCAPE", escape) + return 1 + } + var enclosed byte + str := yyS[yypt-1].item.(string) + if len(str) > 1 { + yylex.Errorf("Incorrect arguments %s to ENCLOSED", escape) + return 1 + } else if len(str) != 0 { + enclosed = str[0] + } + var escaped byte + if len(escape) > 0 { + escaped = escape[0] + } + parser.yyVAL.item = &ast.FieldsClause{ + Terminated: yyS[yypt-2].item.(string), + Enclosed: enclosed, + Escaped: escaped, + } + } + case 1325: + { + parser.yyVAL.item = "\t" + } + case 1326: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1327: + { + parser.yyVAL.item = "" + } + case 1328: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1329: + { + parser.yyVAL.item = "\\" + } + case 1330: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1331: + { + parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} + } + case 1332: + { + parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].item.(string), Terminated: yyS[yypt-0].item.(string)} + } + case 1333: + { + parser.yyVAL.item = "" + } + case 1334: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1335: + { + parser.yyVAL.item = "\n" + } + case 1336: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1347: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + TiDBExtension: yyS[yypt-1].item.(bool), + } + } + case 1348: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + TiDBExtension: yyS[yypt-2].item.(bool), + } + } + case 1349: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + Query: true, + TiDBExtension: yyS[yypt-2].item.(bool), + } + } + case 1350: + { + parser.yyVAL.item = false + } + case 1351: + { + parser.yyVAL.item = true + } + case 1352: + { + parser.yyVAL.statement = &ast.LoadStatsStmt{ + Path: yyS[yypt-0].ident, + } + } + + } + + if yyEx != nil && yyEx.Reduced(r, exState, &parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +}