diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca85b8598146..4181b0dfc0773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,37 @@ # TiDB Changelog All notable changes to this project will be documented in this file. See also [Release Notes](https://github.com/pingcap/docs/blob/master/releases/rn.md), [TiKV Changelog](https://github.com/tikv/tikv/blob/master/CHANGELOG.md) and [PD Changelog](https://github.com/pingcap/pd/blob/master/CHANGELOG.md). +## [2.1.0-rc.4] - 2018-10-23 +### SQL Optimizer +* Fix the issue that column pruning of `UnionAll` is incorrect in some cases [#7941](https://github.com/pingcap/tidb/pull/7941) +* Fix the issue that the result of the `UnionAll` operator is incorrect in some cases [#8007](https://github.com/pingcap/tidb/pull/8007) +### SQL Execution Engine +* Fix the precision issue of the `AVG` function [#7874](https://github.com/pingcap/tidb/pull/7874) +* Support using the `EXPLAIN ANALYZE` statement to check the runtime statistics including the execution time and the number of returned rows of each operator during the query execution process [#7925](https://github.com/pingcap/tidb/pull/7925) +* Fix the panic issue of the `PointGet` operator when a column of a table appears multiple times in the result set [#7943](https://github.com/pingcap/tidb/pull/7943) +* Fix the panic issue caused by too large values in the `Limit` subclause [#8002](https://github.com/pingcap/tidb/pull/8002) +* Fix the panic issue during the execution process of the `AddDate`/`SubDate` statement in some cases [#8009](https://github.com/pingcap/tidb/pull/8009) +### Statistics +* Fix the issue of judging the prefix of the histogram low-bound of the combined index as out of range [#7856](https://github.com/pingcap/tidb/pull/7856) +* Fix the memory leak issue caused by statistics collecting [#7873](https://github.com/pingcap/tidb/pull/7873) +* Fix the panic issue when the histogram is empty [#7928](https://github.com/pingcap/tidb/pull/7928) +* Fix the issue that the histogram bound is out of range when the statistics is being uploaded [#7944](https://github.com/pingcap/tidb/pull/7944) +* Limit the maximum length of values in the statistics sampling process [#7982](https://github.com/pingcap/tidb/pull/7982) +### Server +* Refactor Latch to avoid misjudgment of transaction conflicts and improve the execution performance of concurrent transactions [#7711](https://github.com/pingcap/tidb/pull/7711) +* Fix the panic issue caused by collecting slow queries in some cases [#7874](https://github.com/pingcap/tidb/pull/7847) +* Fix the panic issue when `ESCAPED BY` is an empty string in the `LOAD DATA` statement [#8005](https://github.com/pingcap/tidb/pull/8005) +* Complete the “coprocessor error” log information [#8006](https://github.com/pingcap/tidb/pull/8006) +### Compatibility +* Set the `Command` field of the `SHOW PROCESSLIST` result to `Sleep` when the query is empty [#7839](https://github.com/pingcap/tidb/pull/7839) +### Expressions +* Fix the constant folding issue of the `SYSDATE` function [#7895](https://github.com/pingcap/tidb/pull/7895) +* Fix the issue that `SUBSTRING_INDEX` panics in some cases [#7897](https://github.com/pingcap/tidb/pull/7897) +### DDL +* Fix the stack overflow issue caused by throwing the `invalid ddl job type` error [#7958](https://github.com/pingcap/tidb/pull/7958) +* Fix the issue that the result of `ADMIN CHECK TABLE` is incorrect in some cases [#7975](https://github.com/pingcap/tidb/pull/7975) + + ## [2.1.0-rc.2] - 2018-09-14 ### SQL Optimizer * Put forward a proposal of the next generation Planner [#7543](https://github.com/pingcap/tidb/pull/7543) @@ -15,7 +46,7 @@ All notable changes to this project will be documented in this file. See also [R * Optimize the performance of Hash aggregate operators [#7541](https://github.com/pingcap/tidb/pull/7541) * Optimize the performance of Join operators [#7493](https://github.com/pingcap/tidb/pull/7493), [#7433](https://github.com/pingcap/tidb/pull/7433) * Fix the issue that the result of `UPDATE JOIN` is incorrect when the Join order is changed [#7571](https://github.com/pingcap/tidb/pull/7571) -* Improve the performance of Chunk’s iterator [#7585](https://github.com/pingcap/tidb/pull/7585) +* Improve the performance of Chunk’s iterator [#7585](https://github.com/pingcap/tidb/pull/7585) ### Statistics * Fix the issue that the auto Analyze work repeatedly analyzes the statistics [#7550](https://github.com/pingcap/tidb/pull/7550) * Fix the statistics update error that occurs when there is no statistics change [#7530](https://github.com/pingcap/tidb/pull/7530) diff --git a/Gopkg.lock b/Gopkg.lock index c2843ab18a021..889a38ef909a3 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -3,44 +3,33 @@ [[projects]] branch = "master" - digest = "1:be3ccd9f881604e4dd6d15cccfa126aa309232f0ba075ae5f92d3ef729a62758" name = "github.com/BurntSushi/toml" packages = ["."] - pruneopts = "NUT" revision = "a368813c5e648fee92e5f6c30e3944ff9d5e8895" [[projects]] - digest = "1:9752dad5e89cd779096bf2477a4ded16bea7ac62de453c8d6b4bf841d51a8512" name = "github.com/apache/thrift" packages = ["lib/go/thrift"] - pruneopts = "NUT" revision = "b2a4d4ae21c789b689dd162deb819665567f481c" version = "0.10.0" [[projects]] - digest = "1:75d40fa0c338f4c56056a3985e91fa371e8fcd0293e45b80afa7debecaf56012" name = "github.com/beorn7/perks" packages = ["quantile"] - pruneopts = "NUT" revision = "3ac7bf7a47d159a033b107610db8a1b6575507a4" [[projects]] branch = "master" - digest = "1:7b12da6e82292eb06e24dfe544c628115a3f4316c152f9dcb87d4f60cbf7cd7d" name = "github.com/blacktear23/go-proxyprotocol" packages = ["."] - pruneopts = "NUT" revision = "62e368e1c4700c34b4b6f77afd49b215211574c2" [[projects]] - digest = "1:60142a898f3808b3e6aa604e5f3296bdef921e625ef3223b6019c1a345b8765c" name = "github.com/codahale/hdrhistogram" packages = ["."] - pruneopts = "NUT" revision = "f8ad88b59a584afeee9d334eff879b104439117b" [[projects]] - digest = "1:7a5c43af23a0c21f4f1762d54af95586f9c04836257e66631557d8f8200ef0e1" name = "github.com/coreos/etcd" packages = [ "auth/authpb", @@ -49,81 +38,40 @@ "etcdserver/api/v3rpc/rpctypes", "etcdserver/etcdserverpb", "mvcc/mvccpb", - "pkg/types", + "pkg/types" ] - pruneopts = "NUT" revision = "eddf599c689ec85f4752060edff5a72e81e9106a" version = "v3.2.18" [[projects]] - digest = "1:883ab1d72c3c5851413baad190ebe3ceaf31bb8dece09a943ac07f9e722f811c" - name = "github.com/cznic/golex" - packages = ["lex"] - pruneopts = "NUT" - revision = "da5a7153a51074477ecac5c45a7e5182a0c72448" - -[[projects]] - digest = "1:f80ed82cae006d02025cd63bd7cbe63a7e593de2714db785ea36d6323cc995eb" name = "github.com/cznic/mathutil" packages = ["."] - pruneopts = "NUT" revision = "78ad7f262603437f0ecfebc835d80094f89c8f54" [[projects]] branch = "master" - digest = "1:a7e4a0d213c4c29e79a0da8fe9d16bbcedce561763ff643bff252ea14260f61c" - name = "github.com/cznic/parser" - packages = ["yacc"] - pruneopts = "NUT" - revision = "31edd927e5b19d1c4a260c41a397e7f81d6694d9" - -[[projects]] - branch = "master" - digest = "1:809006f9378a46bcc70bc4330d14f43c1a7818ae9d93c09cab062e575d7e95a2" name = "github.com/cznic/sortutil" packages = ["."] - pruneopts = "NUT" revision = "4c7342852e65c2088c981288f2c5610d10b9f7f4" -[[projects]] - digest = "1:5799bcff29ed827fa851b40b2f650bc777df4b67fd9b8a3041d9d89b9eb2fd86" - name = "github.com/cznic/strutil" - packages = ["."] - pruneopts = "NUT" - revision = "1eb03e3cc9d345307a45ec82bd3016cde4bd4464" - -[[projects]] - digest = "1:71705901e4a356cde002ae6f0052fb661f59971c12262c12006b25cec40025b1" - name = "github.com/cznic/y" - packages = ["."] - pruneopts = "NUT" - revision = "9fdf92d4aac058959f814606bb729ed50f5e4240" - [[projects]] branch = "master" - digest = "1:f18dbc529543fe5fd5294f8385ea1f71681be964c43461f5f45335bb51ba83ae" name = "github.com/etcd-io/gofail" packages = ["runtime"] - pruneopts = "NUT" revision = "51ce9a71510a58bad5ae66ddd278ef28762a1550" [[projects]] - digest = "1:973dbcbbb1be662b61604319582383c315add70906a68d14894f31542ffc3a25" name = "github.com/go-sql-driver/mysql" packages = ["."] - pruneopts = "NUT" revision = "3955978caca48c1658a4bb7a9c6a0f084e326af3" [[projects]] - digest = "1:38e684375ef5b55e812332266d63f9fc5b6329ab303067c4cdda051db6d29ca4" name = "github.com/gogo/protobuf" packages = ["proto"] - pruneopts = "NUT" revision = "636bf0302bc95575d69441b25a2603156ffdddf1" version = "v1.1.1" [[projects]] - digest = "1:6aef947ba53156da1a66ee891d70d61835e0dcfc9f0d728ae1132db651e81c22" name = "github.com/golang/protobuf" packages = [ "jsonpb", @@ -133,135 +81,111 @@ "ptypes/any", "ptypes/duration", "ptypes/struct", - "ptypes/timestamp", + "ptypes/timestamp" ] - pruneopts = "NUT" revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" [[projects]] - digest = "1:c6dfb6c55c1989f1d89622b3c45b786127f76f47322c50e487585f823cb12543" name = "github.com/golang/snappy" packages = ["."] - pruneopts = "NUT" revision = "723cc1e459b8eea2dea4583200fd60757d40097a" [[projects]] branch = "master" - digest = "1:c0883bc20a7c1ff552ff53d414f3cdc28fe847d15fab48c4486aa772ab2fb131" name = "github.com/google/btree" packages = ["."] - pruneopts = "NUT" revision = "316fb6d3f031ae8f4d457c6c5186b9e3ded70435" [[projects]] - digest = "1:dbd86d229eacaa86a98b10f8fb3e3fc69a1913e0f4e010e7cc1f92bf12edca92" name = "github.com/gorilla/context" packages = ["."] - pruneopts = "NUT" revision = "1ea25387ff6f684839d82767c1733ff4d4d15d0a" version = "v1.1" [[projects]] - digest = "1:054b11c45900b575d23fa8e0fa3636a784e2c4d1d43d05e8e20fd592ebe0d5db" name = "github.com/gorilla/mux" packages = ["."] - pruneopts = "NUT" revision = "599cba5e7b6137d46ddf58fb1765f5d928e69604" [[projects]] - digest = "1:0aa5274053fdc232896f0835c712f4a39992d959f8e2363f189a7b0df36f136b" name = "github.com/grpc-ecosystem/go-grpc-middleware" packages = [ ".", "tags", "tracing/opentracing", - "util/metautils", + "util/metautils" ] - pruneopts = "NUT" revision = "82921fcf811d228d2fa202bc31238b356bf9f8d5" [[projects]] - digest = "1:96c558cff0532e2e9ffc0b6d7c8c7431c592d781b109343aa51e27f9fd9a6b82" name = "github.com/grpc-ecosystem/go-grpc-prometheus" packages = ["."] - pruneopts = "NUT" revision = "6b7015e65d366bf3f19b2b2a000a831940f0f7e0" version = "v1.1" [[projects]] - digest = "1:5e55a8699c9ff7aba1e4c8952aeda209685d88d4cb63a8766c338e333b8e65d6" name = "github.com/klauspost/cpuid" packages = ["."] - pruneopts = "NUT" revision = "ae7887de9fa5d2db4eaa8174a7eff2c1ac00f2da" version = "v1.1" [[projects]] branch = "master" - digest = "1:5985ef4caf91ece5d54817c11ea25f182697534f8ae6521eadcd628c142ac4b6" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] - pruneopts = "NUT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" [[projects]] branch = "master" - digest = "1:b95cb972bfd3eb737d334b1703a51a82d1d1d3e92f7f355798d94796c7120c73" name = "github.com/ngaut/pools" packages = ["."] - pruneopts = "NUT" revision = "b7bc8c42aac787667ba45adea78233f53f548443" [[projects]] branch = "master" - digest = "1:7d5f99346aa63d23681f4d92708469f32384d0c26722a4de5725bd0f22caedac" name = "github.com/ngaut/sync2" packages = ["."] - pruneopts = "NUT" revision = "7a24ed77b2efb460c1468b7dc917821c66e80e55" [[projects]] - digest = "1:cc405544fecfb5a8e0c409127ef67ce3b91d11143a00121e5b822e4f8eabe7d2" name = "github.com/opentracing/basictracer-go" packages = [ ".", - "wire", + "wire" ] - pruneopts = "NUT" revision = "1b32af207119a14b1b231d451df3ed04a72efebf" version = "v1.0.0" [[projects]] - digest = "1:7da29c22bcc5c2ffb308324377dc00b5084650348c2799e573ed226d8cc9faf0" name = "github.com/opentracing/opentracing-go" packages = [ ".", "ext", - "log", + "log" ] - pruneopts = "NUT" revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" version = "v1.0.2" [[projects]] branch = "master" - digest = "1:3bf17a6e6eaa6ad24152148a631d18662f7212e21637c2699bff3369b7f00fa2" name = "github.com/petar/GoLLRB" packages = ["llrb"] - pruneopts = "NUT" revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" [[projects]] branch = "master" - digest = "1:dc85cc12f7f97c2b033157f9d40395b2f0458b7bd3083257f8f661ea6f48f89a" name = "github.com/pingcap/check" packages = ["."] - pruneopts = "NUT" revision = "1c287c953996ab3a0bf535dba9d53d809d3dc0b6" [[projects]] - digest = "1:8fd099a567b1e9b3a7e1f66d8547a0d2b1852427e86a0dae96fa59e9583e13e6" + name = "github.com/pingcap/errors" + packages = ["."] + revision = "31ffda8a65b0f910c6d65f1fef40e761fd606384" + version = "v0.10.1" + +[[projects]] name = "github.com/pingcap/goleveldb" packages = [ "leveldb", @@ -275,14 +199,12 @@ "leveldb/opt", "leveldb/storage", "leveldb/table", - "leveldb/util", + "leveldb/util" ] - pruneopts = "NUT" revision = "8d44bfdf1030639ae7130922c95df12d6d4da3b6" [[projects]] branch = "master" - digest = "1:84db0209caf3c48beaec43d15bd22ca6256d958b807c2ac626e2425e232e92c4" name = "github.com/pingcap/kvproto" packages = [ "pkg/coprocessor", @@ -292,100 +214,95 @@ "pkg/metapb", "pkg/pdpb", "pkg/raft_serverpb", - "pkg/tikvpb", + "pkg/tikvpb" ] - pruneopts = "NUT" revision = "529c652955d8fa74faf56f91b2f428d5779fd7d5" [[projects]] branch = "master" - digest = "1:8f576565a8479071ca1951bf678519b1c32480aad8dec2379a64858c31d9e6a9" + name = "github.com/pingcap/parser" + packages = [ + ".", + "ast", + "auth", + "charset", + "format", + "model", + "mysql", + "opcode", + "terror", + "types" + ] + revision = "53ac409ed043f89a850043d2440aaaa7dd863a1c" + +[[projects]] + branch = "master" name = "github.com/pingcap/pd" packages = ["client"] - pruneopts = "NUT" revision = "eb892dda1e33a0b76191d39894ad4a806f313f6e" [[projects]] branch = "master" - digest = "1:14d83225e335cfa449b1f74d03c03ed70db64bf6af83a6e04c43e6e0021d6b94" name = "github.com/pingcap/tipb" packages = [ "go-binlog", "go-tipb", - "sharedbytes", + "sharedbytes" ] - pruneopts = "NUT" - revision = "371b48b15d93924a3a5375019e42b4420bc13d17" + revision = "11e33c750323a0267a6aee335eaaeb7831bdae67" [[projects]] - digest = "1:91fee14a873676b2118c54e08c2e04897ea5c141b55a9b9fb8cf0721458d0d85" name = "github.com/pkg/errors" packages = ["."] - pruneopts = "NUT" revision = "9316aeb006f59424c65ff505c217f90c43d6445d" source = "https://github.com/pingcap/errors.git" version = "v0.9.0" [[projects]] - digest = "1:1ef3c4d6e78616bd3d1b5b7d8899febb9aa1b83d3373fbbdc2804408c7977b57" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/push", + "prometheus/push" ] - pruneopts = "NUT" revision = "c5b7fccd204277076155f10851dad72b76a49317" version = "v0.8.0" [[projects]] - digest = "1:9fe8945a11a9f588a9d306b4741cad634da9015a704271b9506810e2cc77fa17" name = "github.com/prometheus/client_model" packages = ["go"] - pruneopts = "NUT" revision = "fa8ad6fec33561be4280a8f0514318c79d7f6cb6" [[projects]] - digest = "1:c90717fa0864d47e19eaa855af60b202b537795f485052c7f48333c679dd7310" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model", + "model" ] - pruneopts = "NUT" revision = "4402f4e5ea79ec15f3c574773b6a5198fbea215f" [[projects]] - digest = "1:dcfff2d5e99e01dcb856dd8afb0b509c1d05443f0b523cc5333b33a819829ed9" name = "github.com/prometheus/procfs" packages = ["."] - pruneopts = "NUT" revision = "abf152e5f3e97f2fafac028d2cc06c1feb87ffa5" [[projects]] - digest = "1:4c173651d2deb815a0420aeb1b3f7ca3c4aef2d980ba164a501a53f6abf368ef" name = "github.com/sirupsen/logrus" packages = ["."] - pruneopts = "NUT" revision = "3bcb09397d6d88e7676a9bc8433ca11ba5304837" [[projects]] - digest = "1:0af5ed795eeb9df3e3d32e2c0229b012e2c107945f75a0556733d643c94e55be" name = "github.com/spaolacci/murmur3" packages = ["."] - pruneopts = "NUT" revision = "0d12bf811670bf6a1a63828dfbd003eded177fce" version = "v1.0" [[projects]] - digest = "1:194c26fad062f6b1530720ee1afd6cd6f40d79274b2434caef2693b1da5d2ab2" name = "github.com/twinj/uuid" packages = ["."] - pruneopts = "NUT" revision = "70cac2bcd273ef6a371bb96cde363d28b68734c3" [[projects]] - digest = "1:0e28a98b9579858cb5de885935499fefebc8bc44a652cde08a6d035ee7435603" name = "github.com/uber/jaeger-client-go" packages = [ ".", @@ -397,22 +314,18 @@ "thrift-gen/jaeger", "thrift-gen/sampling", "thrift-gen/zipkincore", - "utils", + "utils" ] - pruneopts = "NUT" revision = "d021e646f5187d77b55592c3efee1a2810e895d7" version = "v2.8.0" [[projects]] - digest = "1:0da2810678a062e0567c3215911869b0423da0e497c56683ff8e87e7a6952597" name = "github.com/uber/jaeger-lib" packages = ["metrics"] - pruneopts = "NUT" revision = "3b2a9ad2a045881ab7a0f81d465be54c8292ee4f" version = "v1.1.0" [[projects]] - digest = "1:686219a880e6ec42870431372756a66c19c1396e9fe203b659179422d3c6bf96" name = "golang.org/x/net" packages = [ "context", @@ -421,21 +334,17 @@ "idna", "internal/timeseries", "lex/httplex", - "trace", + "trace" ] - pruneopts = "NUT" revision = "d1e1b351919c6738fdeb9893d5c998b161464f0c" [[projects]] branch = "master" - digest = "1:2f375ec82e53522eb4a1670f2f24f064f407ef2b32e01bb217f5daa4a4d226d6" name = "golang.org/x/sys" packages = ["unix"] - pruneopts = "NUT" revision = "7dfd1290c7917b7ba22824b9d24954ab3002fe24" [[projects]] - digest = "1:a005696b163ffe1842de27eeb3ccfece9d3c2e70d02b83ea1d8c0eeab597c9e0" name = "golang.org/x/text" packages = [ "encoding", @@ -457,23 +366,19 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable", + "unicode/rangetable" ] - pruneopts = "NUT" revision = "4ee4af566555f5fbe026368b75596286a312663a" [[projects]] - digest = "1:0efcfe82e59b828eb6f4115bba88ff45c0898c38e823fbe7f450bdffed9e739b" name = "google.golang.org/genproto" packages = [ "googleapis/api/annotations", - "googleapis/rpc/status", + "googleapis/rpc/status" ] - pruneopts = "NUT" revision = "6b7d9516179cd47f4714cfeb0103ad1dede756c4" [[projects]] - digest = "1:7cd8d3d0020bbbe235958c87a2c042c4a8505e401b6e0496880990228fc34f4b" name = "google.golang.org/grpc" packages = [ ".", @@ -500,88 +405,21 @@ "stats", "status", "tap", - "transport", + "transport" ] - pruneopts = "NUT" revision = "7a6a684ca69eb4cae85ad0a484f2e531598c047b" source = "https://github.com/grpc/grpc-go.git" version = "v1.12.2" [[projects]] - digest = "1:7d95d61ff5828a65cf072a46f3c68d67daffdd11e97d758b0af2176cde717fcd" name = "gopkg.in/natefinch/lumberjack.v2" packages = ["."] - pruneopts = "NUT" revision = "dd45e6a67c53f673bb49ca8a001fd3a63ceb640e" version = "v2.0" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "github.com/BurntSushi/toml", - "github.com/blacktear23/go-proxyprotocol", - "github.com/coreos/etcd/clientv3", - "github.com/coreos/etcd/clientv3/concurrency", - "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes", - "github.com/coreos/etcd/mvcc/mvccpb", - "github.com/cznic/mathutil", - "github.com/cznic/parser/yacc", - "github.com/cznic/sortutil", - "github.com/cznic/strutil", - "github.com/cznic/y", - "github.com/etcd-io/gofail/runtime", - "github.com/go-sql-driver/mysql", - "github.com/golang/protobuf/jsonpb", - "github.com/golang/protobuf/proto", - "github.com/google/btree", - "github.com/gorilla/mux", - "github.com/grpc-ecosystem/go-grpc-middleware", - "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing", - "github.com/grpc-ecosystem/go-grpc-prometheus", - "github.com/klauspost/cpuid", - "github.com/ngaut/pools", - "github.com/ngaut/sync2", - "github.com/opentracing/basictracer-go", - "github.com/opentracing/opentracing-go", - "github.com/pingcap/check", - "github.com/pingcap/goleveldb/leveldb", - "github.com/pingcap/goleveldb/leveldb/comparer", - "github.com/pingcap/goleveldb/leveldb/iterator", - "github.com/pingcap/goleveldb/leveldb/memdb", - "github.com/pingcap/goleveldb/leveldb/opt", - "github.com/pingcap/goleveldb/leveldb/storage", - "github.com/pingcap/goleveldb/leveldb/util", - "github.com/pingcap/kvproto/pkg/coprocessor", - "github.com/pingcap/kvproto/pkg/errorpb", - "github.com/pingcap/kvproto/pkg/kvrpcpb", - "github.com/pingcap/kvproto/pkg/metapb", - "github.com/pingcap/kvproto/pkg/tikvpb", - "github.com/pingcap/pd/client", - "github.com/pingcap/tipb/go-binlog", - "github.com/pingcap/tipb/go-tipb", - "github.com/pkg/errors", - "github.com/prometheus/client_golang/prometheus", - "github.com/prometheus/client_golang/prometheus/push", - "github.com/sirupsen/logrus", - "github.com/spaolacci/murmur3", - "github.com/twinj/uuid", - "github.com/uber/jaeger-client-go/config", - "golang.org/x/net/context", - "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", - "golang.org/x/text/transform", - "google.golang.org/grpc", - "google.golang.org/grpc/codes", - "google.golang.org/grpc/credentials", - "google.golang.org/grpc/keepalive", - "google.golang.org/grpc/metadata", - "gopkg.in/natefinch/lumberjack.v2", - ] + inputs-digest = "97e05f1d47a56848ca61ce3ca55d52257dca3643cb3b540136da4029fb4c45e8" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 2c29ff527877a..b67407783d317 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -28,10 +28,6 @@ required = ["github.com/golang/protobuf/jsonpb"] version = "1.1.0" name = "github.com/golang/protobuf" -[[constraint]] - branch = "master" - name = "github.com/cznic/parser" - [[constraint]] branch = "master" name = "github.com/cznic/sortutil" @@ -102,3 +98,6 @@ required = ["github.com/golang/protobuf/jsonpb"] version = "0.9.0" source = "https://github.com/pingcap/errors.git" +[[constraint]] + branch = "master" + name = "github.com/pingcap/parser" \ No newline at end of file diff --git a/Makefile b/Makefile index a3013863c404d..9e9e15ee0077e 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ FILES := $$(find $$($(PACKAGE_DIRECTORIES)) -name "*.go" | grep -vE "vendor" GOFAIL_ENABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|vendor)" | xargs gofail enable) GOFAIL_DISABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|vendor)" | xargs gofail disable) -LDFLAGS += -X "github.com/pingcap/tidb/mysql.TiDBReleaseVersion=$(shell git describe --tags --dirty)" +LDFLAGS += -X "github.com/pingcap/parser/mysql.TiDBReleaseVersion=$(shell git describe --tags --dirty)" LDFLAGS += -X "github.com/pingcap/tidb/util/printer.TiDBBuildTS=$(shell date -u '+%Y-%m-%d %I:%M:%S')" LDFLAGS += -X "github.com/pingcap/tidb/util/printer.TiDBGitHash=$(shell git rev-parse HEAD)" LDFLAGS += -X "github.com/pingcap/tidb/util/printer.TiDBGitBranch=$(shell git rev-parse --abbrev-ref HEAD)" @@ -40,7 +40,7 @@ CHECK_LDFLAGS += $(LDFLAGS) ${TEST_LDFLAGS} TARGET = "" -.PHONY: all build update parser clean todo test gotest interpreter server dev benchkv benchraw check parserlib checklist +.PHONY: all build update clean todo test gotest interpreter server dev benchkv benchraw check checklist parser default: server buildsucc @@ -51,35 +51,14 @@ buildsucc: all: dev server benchkv -dev: checklist parserlib test check +parser: + @echo "remove this command later" + +dev: checklist test check build: $(GOBUILD) -goyacc: - $(GOBUILD) -o bin/goyacc parser/goyacc/main.go - -parser: goyacc - bin/goyacc -o /dev/null parser/parser.y - bin/goyacc -o parser/parser.go parser/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/parser.go; \ - elif [ $(ARCH) = $(MAC) ]; \ - then \ - /usr/bin/sed -i "" 's|//line.*||' parser/parser.go; \ - /usr/bin/sed -i "" 's/yyEofCode/yyEOFCode/' parser/parser.go; \ - fi - - @awk 'BEGIN{print "// Code generated by goyacc"} {print $0}' parser/parser.go > tmp_parser.go && mv tmp_parser.go parser/parser.go; - -parserlib: parser/parser.go - -parser/parser.go: parser/parser.y - make parser - # The retool tools.json is setup from hack/retool-install.sh check-setup: @which retool >/dev/null 2>&1 || go get github.com/twitchtv/retool @@ -134,7 +113,7 @@ test: checklist gotest explaintest explaintest: server @cd cmd/explaintest && ./run-tests.sh -s ../../bin/tidb-server -gotest: parserlib +gotest: go get github.com/etcd-io/gofail @$(GOFAIL_ENABLE) ifeq ("$(TRAVIS_COVERAGE)", "1") @@ -151,21 +130,21 @@ else endif @$(GOFAIL_DISABLE) -race: parserlib +race: go get github.com/etcd-io/gofail @$(GOFAIL_ENABLE) @export log_level=debug; \ $(GOTEST) -timeout 20m -race $(PACKAGES) || { $(GOFAIL_DISABLE); exit 1; } @$(GOFAIL_DISABLE) -leak: parserlib +leak: go get github.com/etcd-io/gofail @$(GOFAIL_ENABLE) @export log_level=debug; \ $(GOTEST) -tags leak $(PACKAGES) || { $(GOFAIL_DISABLE); exit 1; } @$(GOFAIL_DISABLE) -tikv_integration_test: parserlib +tikv_integration_test: go get github.com/etcd-io/gofail @$(GOFAIL_ENABLE) $(GOTEST) ./store/tikv/. -with-tikv=true || { $(GOFAIL_DISABLE); exit 1; } @@ -182,14 +161,14 @@ ifeq ("$(WITH_CHECK)", "1") CHECK_FLAG = $(TEST_LDFLAGS) endif -server: parserlib +server: ifeq ($(TARGET), "") $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o bin/tidb-server tidb-server/main.go else $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o '$(TARGET)' tidb-server/main.go endif -server_check: parserlib +server_check: ifeq ($(TARGET), "") $(GOBUILD) $(RACE_FLAG) -ldflags '$(CHECK_LDFLAGS)' -o bin/tidb-server tidb-server/main.go else diff --git a/ast/ddl_test.go b/ast/ddl_test.go deleted file mode 100644 index 1aa83a5092a19..0000000000000 --- a/ast/ddl_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// 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/tidb/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_test.go b/ast/dml_test.go deleted file mode 100644 index 9c6decc35c295..0000000000000 --- a/ast/dml_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// 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/tidb/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_test.go b/ast/expressions_test.go deleted file mode 100644 index 9176e36b70f3a..0000000000000 --- a/ast/expressions_test.go +++ /dev/null @@ -1,102 +0,0 @@ -// 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/tidb/ast" -) - -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}, - {&ParamMarkerExpr{}, 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}, - {&ValueExpr{}, 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_test.go b/ast/flag_test.go deleted file mode 100644 index a3f7c5d3762c8..0000000000000 --- a/ast/flag_test.go +++ /dev/null @@ -1,153 +0,0 @@ -// 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/tidb/ast" - "github.com/pingcap/tidb/parser" -) - -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 deleted file mode 100644 index a5a70030e69b2..0000000000000 --- a/ast/format_test.go +++ /dev/null @@ -1,98 +0,0 @@ -package ast_test - -import ( - "bytes" - "fmt" - - . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/parser" -) - -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_test.go b/ast/functions_test.go deleted file mode 100644 index f54120c717fd2..0000000000000 --- a/ast/functions_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// 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/tidb/ast" -) - -var _ = Suite(&testFunctionsSuite{}) - -type testFunctionsSuite struct { -} - -func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { - 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_test.go b/ast/misc_test.go deleted file mode 100644 index d9c14f753fe5f..0000000000000 --- a/ast/misc_test.go +++ /dev/null @@ -1,189 +0,0 @@ -// 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/tidb/ast" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/util/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) { - 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_test.go b/ast/read_only_checker_test.go deleted file mode 100644 index 7abd27f066fe5..0000000000000 --- a/ast/read_only_checker_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// 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/cmd/benchdb/main.go b/cmd/benchdb/main.go index e6a91936b9869..54dacd9bcfbc5 100644 --- a/cmd/benchdb/main.go +++ b/cmd/benchdb/main.go @@ -21,9 +21,9 @@ import ( "strings" "time" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/logutil" log "github.com/sirupsen/logrus" "golang.org/x/net/context" diff --git a/cmd/benchfilesort/main.go b/cmd/benchfilesort/main.go index 296afe0554bb6..3116638efb902 100644 --- a/cmd/benchfilesort/main.go +++ b/cmd/benchfilesort/main.go @@ -24,8 +24,8 @@ import ( "runtime/pprof" "time" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/filesort" diff --git a/cmd/benchkv/main.go b/cmd/benchkv/main.go index 06d35ec9a0139..9210170dba708 100644 --- a/cmd/benchkv/main.go +++ b/cmd/benchkv/main.go @@ -24,9 +24,9 @@ import ( _ "github.com/go-sql-driver/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" diff --git a/cmd/benchraw/main.go b/cmd/benchraw/main.go index fcbc3ec428101..f1c6f30b40279 100644 --- a/cmd/benchraw/main.go +++ b/cmd/benchraw/main.go @@ -22,9 +22,9 @@ import ( "sync" "time" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) diff --git a/cmd/explaintest/main.go b/cmd/explaintest/main.go index 2da89d708e071..cc3e6dd9b6e61 100644 --- a/cmd/explaintest/main.go +++ b/cmd/explaintest/main.go @@ -26,7 +26,7 @@ import ( "flag" "github.com/go-sql-driver/mysql" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/logutil" diff --git a/cmd/explaintest/r/explain_complex_stats.result b/cmd/explaintest/r/explain_complex_stats.result index f00603e25c4ad..b0723109e8eb1 100644 --- a/cmd/explaintest/r/explain_complex_stats.result +++ b/cmd/explaintest/r/explain_complex_stats.result @@ -158,11 +158,11 @@ Projection_5 39.28 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st. └─TableScan_14 160.23 cop table:st, keep order:false explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; id count task operator info -Projection_9 428.55 root dt.id, dt.aid, dt.pt, dt.dic, dt.cm, rr.gid, rr.acd, rr.t, dt.p1, dt.p2, dt.p3, dt.p4, dt.p5, dt.p6_md5, dt.p7_md5 -└─Limit_12 428.55 root offset:0, count:2000 - └─IndexJoin_18 428.55 root inner join, inner:IndexLookUp_17, outer key:dt.aid, dt.dic, inner key:rr.aid, rr.dic - ├─TableReader_42 428.55 root data:Selection_41 - │ └─Selection_41 428.55 cop eq(dt.bm, 0), eq(dt.pt, "ios"), gt(dt.t, 1478185592) +Projection_9 428.32 root dt.id, dt.aid, dt.pt, dt.dic, dt.cm, rr.gid, rr.acd, rr.t, dt.p1, dt.p2, dt.p3, dt.p4, dt.p5, dt.p6_md5, dt.p7_md5 +└─Limit_12 428.32 root offset:0, count:2000 + └─IndexJoin_18 428.32 root inner join, inner:IndexLookUp_17, outer key:dt.aid, dt.dic, inner key:rr.aid, rr.dic + ├─TableReader_42 428.32 root data:Selection_41 + │ └─Selection_41 428.32 cop eq(dt.bm, 0), eq(dt.pt, "ios"), gt(dt.t, 1478185592) │ └─TableScan_40 2000.00 cop table:dt, range:[0,+inf], keep order:false └─IndexLookUp_17 970.00 root ├─IndexScan_14 1.00 cop table:rr, index:aid, dic, range: decided by [dt.aid dt.dic], keep order:false diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 20c479463d958..dbde6d506a2ff 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -268,7 +268,7 @@ create table t(a int primary key, b int, c int, index idx(b)); explain select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; id count task operator info Projection_11 10000.00 root 9_aux_0 -└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))] +└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)] ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo └─StreamAgg_20 1.00 root funcs:count(1) @@ -281,7 +281,7 @@ Projection_11 10000.00 root 9_aux_0 explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; id count task operator info Projection_11 10000.00 root 9_aux_0 -└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))] +└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)] ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo └─StreamAgg_20 1.00 root funcs:count(1) @@ -293,7 +293,7 @@ Projection_11 10000.00 root 9_aux_0 explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; id count task operator info Projection_11 10000.00 root 9_aux_0 -└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))] +└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)] ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo └─StreamAgg_20 1.00 root funcs:count(1) @@ -385,3 +385,63 @@ Projection_5 8000.00 root test.ta.a └─TableReader_9 10000.00 root data:TableScan_8 └─TableScan_8 10000.00 cop table:ta, range:[-inf,+inf], keep order:false, stats:pseudo rollback; +drop table if exists t; +create table t(a int, nb int not null, nc int not null); +explain select ifnull(a, 0) from t; +id count task operator info +Projection_3 10000.00 root ifnull(test.t.a, 0) +└─TableReader_5 10000.00 root data:TableScan_4 + └─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select ifnull(nb, 0) from t; +id count task operator info +TableReader_5 10000.00 root data:TableScan_4 +└─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select ifnull(nb, 0), ifnull(nc, 0) from t; +id count task operator info +TableReader_5 10000.00 root data:TableScan_4 +└─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select ifnull(a, 0), ifnull(nb, 0) from t; +id count task operator info +Projection_3 10000.00 root ifnull(test.t.a, 0), test.t.nb +└─TableReader_5 10000.00 root data:TableScan_4 + └─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select ifnull(nb, 0), ifnull(nb, 0) from t; +id count task operator info +Projection_3 10000.00 root test.t.nb, test.t.nb +└─TableReader_5 10000.00 root data:TableScan_4 + └─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select 1+ifnull(nb, 0) from t; +id count task operator info +Projection_3 10000.00 root plus(1, test.t.nb) +└─TableReader_5 10000.00 root data:TableScan_4 + └─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select 1+ifnull(a, 0) from t; +id count task operator info +Projection_3 10000.00 root plus(1, ifnull(test.t.a, 0)) +└─TableReader_5 10000.00 root data:TableScan_4 + └─TableScan_4 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +drop table if exists t; +drop table if exists t; +create table t(a int); +explain select * from t where _tidb_rowid = 0; +id count task operator info +Projection_4 8000.00 root test.t.a +└─TableReader_6 10000.00 root data:TableScan_5 + └─TableScan_5 10000.00 cop table:t, range:[0,0], keep order:false, stats:pseudo +explain select * from t where _tidb_rowid > 0; +id count task operator info +Projection_4 8000.00 root test.t.a +└─TableReader_6 10000.00 root data:TableScan_5 + └─TableScan_5 10000.00 cop table:t, range:(0,+inf], keep order:false, stats:pseudo +explain select a, _tidb_rowid from t where a > 0; +id count task operator info +TableReader_7 3333.33 root data:Selection_6 +└─Selection_6 3333.33 cop gt(test.t.a, 0) + └─TableScan_5 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t where _tidb_rowid > 0 and a > 0; +id count task operator info +Projection_4 2666.67 root test.t.a +└─TableReader_7 2666.67 root data:Selection_6 + └─Selection_6 2666.67 cop gt(test.t.a, 0) + └─TableScan_5 3333.33 cop table:t, range:(0,+inf], keep order:false, stats:pseudo +drop table if exists t; diff --git a/cmd/explaintest/r/explain_easy_stats.result b/cmd/explaintest/r/explain_easy_stats.result index b93c0e4b6f3fd..73cbf7877b685 100644 --- a/cmd/explaintest/r/explain_easy_stats.result +++ b/cmd/explaintest/r/explain_easy_stats.result @@ -47,10 +47,10 @@ explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; id count task operator info Projection_6 2481.25 root test.t1.c1, test.t1.c2, test.t1.c3, test.t2.c1, test.t2.c2 └─MergeJoin_7 2481.25 root left outer join, left key:test.t1.c2, right key:test.t2.c1 - ├─IndexLookUp_17 1999.00 root - │ ├─Selection_16 1999.00 cop gt(test.t1.c1, 1) + ├─IndexLookUp_17 1998.00 root + │ ├─Selection_16 1998.00 cop gt(test.t1.c1, 1) │ │ └─IndexScan_14 1999.00 cop table:t1, index:c2, range:[NULL,+inf], keep order:true - │ └─TableScan_15 1999.00 cop table:t1, keep order:false + │ └─TableScan_15 1998.00 cop table:t1, keep order:false └─IndexLookUp_21 1985.00 root ├─IndexScan_19 1985.00 cop table:t2, index:c1, range:[NULL,+inf], keep order:true └─TableScan_20 1985.00 cop table:t2, keep order:false diff --git a/cmd/explaintest/r/partition_pruning.result b/cmd/explaintest/r/partition_pruning.result new file mode 100644 index 0000000000000..5881c7f655101 --- /dev/null +++ b/cmd/explaintest/r/partition_pruning.result @@ -0,0 +1,5303 @@ +set @@session.tidb_enable_table_partition=1; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +# +# Bug#53806: Wrong estimates for range query in partitioned MyISAM table +# Bug#46754: 'rows' field doesn't reflect partition pruning +# +CREATE TABLE t1 (a INT PRIMARY KEY) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (1), +PARTITION p1 VALUES LESS THAN (2), +PARTITION p2 VALUES LESS THAN (3), +PARTITION p3 VALUES LESS THAN (4), +PARTITION p4 VALUES LESS THAN (5), +PARTITION p5 VALUES LESS THAN (6), +PARTITION max VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +id count task operator info +Union_8 2.00 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p0, range:[-inf,1], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:p1, range:[-inf,1], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE a < 7; +id count task operator info +Union_13 49.00 root +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p0, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p1, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p2, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_21 3333.33 root data:TableScan_20 +│ └─TableScan_20 3333.33 cop table:t1, partition:p3, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:TableScan_22 +│ └─TableScan_22 3333.33 cop table:t1, partition:p4, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_25 3333.33 root data:TableScan_24 +│ └─TableScan_24 3333.33 cop table:t1, partition:p5, range:[-inf,7), keep order:false, stats:pseudo +└─TableReader_27 3333.33 root data:TableScan_26 + └─TableScan_26 3333.33 cop table:t1, partition:max, range:[-inf,7), keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +id count task operator info +Union_8 2.00 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p0, range:[-inf,1], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:p1, range:[-inf,1], keep order:false, stats:pseudo +DROP TABLE t1; +# +# Bug#49742: Partition Pruning not working correctly for RANGE +# +CREATE TABLE t1 (a INT PRIMARY KEY) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (1), +PARTITION p1 VALUES LESS THAN (2), +PARTITION p2 VALUES LESS THAN (3), +PARTITION p3 VALUES LESS THAN (4), +PARTITION p4 VALUES LESS THAN (5), +PARTITION p5 VALUES LESS THAN (6), +PARTITION max VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); +SELECT * FROM t1 WHERE a < 1 order by a; +a +-1 +0 +EXPLAIN SELECT * FROM t1 WHERE a < 1; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:p0, range:[-inf,1), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 2 order by a; +a +-1 +0 +1 +EXPLAIN SELECT * FROM t1 WHERE a < 2; +id count task operator info +Union_8 4.00 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p0, range:[-inf,2), keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:p1, range:[-inf,2), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 3 order by a; +a +-1 +0 +1 +2 +EXPLAIN SELECT * FROM t1 WHERE a < 3; +id count task operator info +Union_9 9.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p0, range:[-inf,3), keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p1, range:[-inf,3), keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:p2, range:[-inf,3), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 4 order by a; +a +-1 +0 +1 +2 +3 +EXPLAIN SELECT * FROM t1 WHERE a < 4; +id count task operator info +Union_10 16.00 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p0, range:[-inf,4), keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p1, range:[-inf,4), keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p2, range:[-inf,4), keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:p3, range:[-inf,4), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 5 order by a; +a +-1 +0 +1 +2 +3 +4 +EXPLAIN SELECT * FROM t1 WHERE a < 5; +id count task operator info +Union_11 25.00 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p0, range:[-inf,5), keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p1, range:[-inf,5), keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p2, range:[-inf,5), keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p3, range:[-inf,5), keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:p4, range:[-inf,5), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 6 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +EXPLAIN SELECT * FROM t1 WHERE a < 6; +id count task operator info +Union_12 36.00 root +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p0, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p1, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_18 3333.33 root data:TableScan_17 +│ └─TableScan_17 3333.33 cop table:t1, partition:p2, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:TableScan_19 +│ └─TableScan_19 3333.33 cop table:t1, partition:p3, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_22 3333.33 root data:TableScan_21 +│ └─TableScan_21 3333.33 cop table:t1, partition:p4, range:[-inf,6), keep order:false, stats:pseudo +└─TableReader_24 3333.33 root data:TableScan_23 + └─TableScan_23 3333.33 cop table:t1, partition:p5, range:[-inf,6), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 7 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +6 +EXPLAIN SELECT * FROM t1 WHERE a < 7; +id count task operator info +Union_13 49.00 root +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p0, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p1, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p2, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_21 3333.33 root data:TableScan_20 +│ └─TableScan_20 3333.33 cop table:t1, partition:p3, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:TableScan_22 +│ └─TableScan_22 3333.33 cop table:t1, partition:p4, range:[-inf,7), keep order:false, stats:pseudo +├─TableReader_25 3333.33 root data:TableScan_24 +│ └─TableScan_24 3333.33 cop table:t1, partition:p5, range:[-inf,7), keep order:false, stats:pseudo +└─TableReader_27 3333.33 root data:TableScan_26 + └─TableScan_26 3333.33 cop table:t1, partition:max, range:[-inf,7), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 1 order by a; +a +-1 +0 +1 +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +id count task operator info +Union_8 2.00 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p0, range:[-inf,1], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:p1, range:[-inf,1], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 2 order by a; +a +-1 +0 +1 +2 +EXPLAIN SELECT * FROM t1 WHERE a <= 2; +id count task operator info +Union_9 6.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p0, range:[-inf,2], keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p1, range:[-inf,2], keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:p2, range:[-inf,2], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 3 order by a; +a +-1 +0 +1 +2 +3 +EXPLAIN SELECT * FROM t1 WHERE a <= 3; +id count task operator info +Union_10 12.00 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p0, range:[-inf,3], keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p1, range:[-inf,3], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p2, range:[-inf,3], keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:p3, range:[-inf,3], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 4 order by a; +a +-1 +0 +1 +2 +3 +4 +EXPLAIN SELECT * FROM t1 WHERE a <= 4; +id count task operator info +Union_11 20.00 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p0, range:[-inf,4], keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p1, range:[-inf,4], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p2, range:[-inf,4], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p3, range:[-inf,4], keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:p4, range:[-inf,4], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 5 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +EXPLAIN SELECT * FROM t1 WHERE a <= 5; +id count task operator info +Union_12 30.00 root +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p0, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p1, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_18 3333.33 root data:TableScan_17 +│ └─TableScan_17 3333.33 cop table:t1, partition:p2, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:TableScan_19 +│ └─TableScan_19 3333.33 cop table:t1, partition:p3, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_22 3333.33 root data:TableScan_21 +│ └─TableScan_21 3333.33 cop table:t1, partition:p4, range:[-inf,5], keep order:false, stats:pseudo +└─TableReader_24 3333.33 root data:TableScan_23 + └─TableScan_23 3333.33 cop table:t1, partition:p5, range:[-inf,5], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 6 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +6 +EXPLAIN SELECT * FROM t1 WHERE a <= 6; +id count task operator info +Union_13 42.00 root +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p0, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p1, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p2, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_21 3333.33 root data:TableScan_20 +│ └─TableScan_20 3333.33 cop table:t1, partition:p3, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:TableScan_22 +│ └─TableScan_22 3333.33 cop table:t1, partition:p4, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_25 3333.33 root data:TableScan_24 +│ └─TableScan_24 3333.33 cop table:t1, partition:p5, range:[-inf,6], keep order:false, stats:pseudo +└─TableReader_27 3333.33 root data:TableScan_26 + └─TableScan_26 3333.33 cop table:t1, partition:max, range:[-inf,6], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 7 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a <= 7; +id count task operator info +Union_13 49.00 root +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p0, range:[-inf,7], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p1, range:[-inf,7], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p2, range:[-inf,7], keep order:false, stats:pseudo +├─TableReader_21 3333.33 root data:TableScan_20 +│ └─TableScan_20 3333.33 cop table:t1, partition:p3, range:[-inf,7], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:TableScan_22 +│ └─TableScan_22 3333.33 cop table:t1, partition:p4, range:[-inf,7], keep order:false, stats:pseudo +├─TableReader_25 3333.33 root data:TableScan_24 +│ └─TableScan_24 3333.33 cop table:t1, partition:p5, range:[-inf,7], keep order:false, stats:pseudo +└─TableReader_27 3333.33 root data:TableScan_26 + └─TableScan_26 3333.33 cop table:t1, partition:max, range:[-inf,7], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 1 order by a; +a +1 +EXPLAIN SELECT * FROM t1 WHERE a = 1; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p1, range:[1,1], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 2 order by a; +a +2 +EXPLAIN SELECT * FROM t1 WHERE a = 2; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p2, range:[2,2], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 3 order by a; +a +3 +EXPLAIN SELECT * FROM t1 WHERE a = 3; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p3, range:[3,3], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 4 order by a; +a +4 +EXPLAIN SELECT * FROM t1 WHERE a = 4; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p4, range:[4,4], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 5 order by a; +a +5 +EXPLAIN SELECT * FROM t1 WHERE a = 5; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p5, range:[5,5], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 6 order by a; +a +6 +EXPLAIN SELECT * FROM t1 WHERE a = 6; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:max, range:[6,6], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 7 order by a; +a +7 +EXPLAIN SELECT * FROM t1 WHERE a = 7; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:max, range:[7,7], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 1 order by a; +a +1 +2 +3 +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 1; +id count task operator info +Union_12 20000.00 root +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p1, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p2, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_18 3333.33 root data:TableScan_17 +│ └─TableScan_17 3333.33 cop table:t1, partition:p3, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:TableScan_19 +│ └─TableScan_19 3333.33 cop table:t1, partition:p4, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_22 3333.33 root data:TableScan_21 +│ └─TableScan_21 3333.33 cop table:t1, partition:p5, range:[1,+inf], keep order:false, stats:pseudo +└─TableReader_24 3333.33 root data:TableScan_23 + └─TableScan_23 3333.33 cop table:t1, partition:max, range:[1,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 2 order by a; +a +2 +3 +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 2; +id count task operator info +Union_11 16666.67 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p2, range:[2,+inf], keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p3, range:[2,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p4, range:[2,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p5, range:[2,+inf], keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:max, range:[2,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 3 order by a; +a +3 +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 3; +id count task operator info +Union_10 13333.33 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p3, range:[3,+inf], keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p4, range:[3,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p5, range:[3,+inf], keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:max, range:[3,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 4 order by a; +a +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 4; +id count task operator info +Union_9 10000.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p4, range:[4,+inf], keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p5, range:[4,+inf], keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:max, range:[4,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 5 order by a; +a +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 5; +id count task operator info +Union_8 6666.67 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p5, range:[5,+inf], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:max, range:[5,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 6 order by a; +a +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 6; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:[6,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 7 order by a; +a +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a >= 7; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:[7,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 1 order by a; +a +2 +3 +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a > 1; +id count task operator info +Union_11 16666.67 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p2, range:(1,+inf], keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p3, range:(1,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p4, range:(1,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p5, range:(1,+inf], keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:max, range:(1,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 2 order by a; +a +3 +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a > 2; +id count task operator info +Union_10 13333.33 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p3, range:(2,+inf], keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p4, range:(2,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p5, range:(2,+inf], keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:max, range:(2,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 3 order by a; +a +4 +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a > 3; +id count task operator info +Union_9 10000.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p4, range:(3,+inf], keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p5, range:(3,+inf], keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:max, range:(3,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 4 order by a; +a +5 +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a > 4; +id count task operator info +Union_8 6666.67 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p5, range:(4,+inf], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:max, range:(4,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 5 order by a; +a +6 +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a > 5; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:(5,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 6 order by a; +a +7 +8 +EXPLAIN SELECT * FROM t1 WHERE a > 6; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:(6,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 7 order by a; +a +8 +EXPLAIN SELECT * FROM t1 WHERE a > 7; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:(7,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +CREATE TABLE t1 (a INT PRIMARY KEY) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (1), +PARTITION p1 VALUES LESS THAN (2), +PARTITION p2 VALUES LESS THAN (3), +PARTITION p3 VALUES LESS THAN (4), +PARTITION p4 VALUES LESS THAN (5), +PARTITION max VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7); +SELECT * FROM t1 WHERE a < 1 order by a; +a +-1 +0 +EXPLAIN SELECT * FROM t1 WHERE a < 1; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:p0, range:[-inf,1), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 2 order by a; +a +-1 +0 +1 +EXPLAIN SELECT * FROM t1 WHERE a < 2; +id count task operator info +Union_8 4.00 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p0, range:[-inf,2), keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:p1, range:[-inf,2), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 3 order by a; +a +-1 +0 +1 +2 +EXPLAIN SELECT * FROM t1 WHERE a < 3; +id count task operator info +Union_9 9.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p0, range:[-inf,3), keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p1, range:[-inf,3), keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:p2, range:[-inf,3), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 4 order by a; +a +-1 +0 +1 +2 +3 +EXPLAIN SELECT * FROM t1 WHERE a < 4; +id count task operator info +Union_10 16.00 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p0, range:[-inf,4), keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p1, range:[-inf,4), keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p2, range:[-inf,4), keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:p3, range:[-inf,4), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 5 order by a; +a +-1 +0 +1 +2 +3 +4 +EXPLAIN SELECT * FROM t1 WHERE a < 5; +id count task operator info +Union_11 25.00 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p0, range:[-inf,5), keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p1, range:[-inf,5), keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p2, range:[-inf,5), keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p3, range:[-inf,5), keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:p4, range:[-inf,5), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a < 6 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +EXPLAIN SELECT * FROM t1 WHERE a < 6; +id count task operator info +Union_12 36.00 root +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p0, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p1, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_18 3333.33 root data:TableScan_17 +│ └─TableScan_17 3333.33 cop table:t1, partition:p2, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:TableScan_19 +│ └─TableScan_19 3333.33 cop table:t1, partition:p3, range:[-inf,6), keep order:false, stats:pseudo +├─TableReader_22 3333.33 root data:TableScan_21 +│ └─TableScan_21 3333.33 cop table:t1, partition:p4, range:[-inf,6), keep order:false, stats:pseudo +└─TableReader_24 3333.33 root data:TableScan_23 + └─TableScan_23 3333.33 cop table:t1, partition:max, range:[-inf,6), keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 1 order by a; +a +-1 +0 +1 +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +id count task operator info +Union_8 2.00 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p0, range:[-inf,1], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:p1, range:[-inf,1], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 2 order by a; +a +-1 +0 +1 +2 +EXPLAIN SELECT * FROM t1 WHERE a <= 2; +id count task operator info +Union_9 6.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p0, range:[-inf,2], keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p1, range:[-inf,2], keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:p2, range:[-inf,2], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 3 order by a; +a +-1 +0 +1 +2 +3 +EXPLAIN SELECT * FROM t1 WHERE a <= 3; +id count task operator info +Union_10 12.00 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p0, range:[-inf,3], keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p1, range:[-inf,3], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p2, range:[-inf,3], keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:p3, range:[-inf,3], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 4 order by a; +a +-1 +0 +1 +2 +3 +4 +EXPLAIN SELECT * FROM t1 WHERE a <= 4; +id count task operator info +Union_11 20.00 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p0, range:[-inf,4], keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p1, range:[-inf,4], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p2, range:[-inf,4], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p3, range:[-inf,4], keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:p4, range:[-inf,4], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 5 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +EXPLAIN SELECT * FROM t1 WHERE a <= 5; +id count task operator info +Union_12 30.00 root +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p0, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p1, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_18 3333.33 root data:TableScan_17 +│ └─TableScan_17 3333.33 cop table:t1, partition:p2, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:TableScan_19 +│ └─TableScan_19 3333.33 cop table:t1, partition:p3, range:[-inf,5], keep order:false, stats:pseudo +├─TableReader_22 3333.33 root data:TableScan_21 +│ └─TableScan_21 3333.33 cop table:t1, partition:p4, range:[-inf,5], keep order:false, stats:pseudo +└─TableReader_24 3333.33 root data:TableScan_23 + └─TableScan_23 3333.33 cop table:t1, partition:max, range:[-inf,5], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a <= 6 order by a; +a +-1 +0 +1 +2 +3 +4 +5 +6 +EXPLAIN SELECT * FROM t1 WHERE a <= 6; +id count task operator info +Union_12 36.00 root +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p0, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p1, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_18 3333.33 root data:TableScan_17 +│ └─TableScan_17 3333.33 cop table:t1, partition:p2, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:TableScan_19 +│ └─TableScan_19 3333.33 cop table:t1, partition:p3, range:[-inf,6], keep order:false, stats:pseudo +├─TableReader_22 3333.33 root data:TableScan_21 +│ └─TableScan_21 3333.33 cop table:t1, partition:p4, range:[-inf,6], keep order:false, stats:pseudo +└─TableReader_24 3333.33 root data:TableScan_23 + └─TableScan_23 3333.33 cop table:t1, partition:max, range:[-inf,6], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 1; +a +1 +EXPLAIN SELECT * FROM t1 WHERE a = 1; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p1, range:[1,1], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 2; +a +2 +EXPLAIN SELECT * FROM t1 WHERE a = 2; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p2, range:[2,2], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 3; +a +3 +EXPLAIN SELECT * FROM t1 WHERE a = 3; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p3, range:[3,3], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 4; +a +4 +EXPLAIN SELECT * FROM t1 WHERE a = 4; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:p4, range:[4,4], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 5; +a +5 +EXPLAIN SELECT * FROM t1 WHERE a = 5; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:max, range:[5,5], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a = 6; +a +6 +EXPLAIN SELECT * FROM t1 WHERE a = 6; +id count task operator info +TableReader_7 1.00 root data:TableScan_6 +└─TableScan_6 1.00 cop table:t1, partition:max, range:[6,6], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 1 order by a; +a +1 +2 +3 +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a >= 1; +id count task operator info +Union_11 16666.67 root +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p1, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_15 3333.33 root data:TableScan_14 +│ └─TableScan_14 3333.33 cop table:t1, partition:p2, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:TableScan_16 +│ └─TableScan_16 3333.33 cop table:t1, partition:p3, range:[1,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:TableScan_18 +│ └─TableScan_18 3333.33 cop table:t1, partition:p4, range:[1,+inf], keep order:false, stats:pseudo +└─TableReader_21 3333.33 root data:TableScan_20 + └─TableScan_20 3333.33 cop table:t1, partition:max, range:[1,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 2 order by a; +a +2 +3 +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a >= 2; +id count task operator info +Union_10 13333.33 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p2, range:[2,+inf], keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p3, range:[2,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p4, range:[2,+inf], keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:max, range:[2,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 3 order by a; +a +3 +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a >= 3; +id count task operator info +Union_9 10000.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p3, range:[3,+inf], keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p4, range:[3,+inf], keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:max, range:[3,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 4 order by a; +a +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a >= 4; +id count task operator info +Union_8 6666.67 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p4, range:[4,+inf], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:max, range:[4,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 5 order by a; +a +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a >= 5; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:[5,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a >= 6 order by a; +a +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a >= 6; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:[6,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 1 order by a; +a +2 +3 +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a > 1; +id count task operator info +Union_10 13333.33 root +├─TableReader_12 3333.33 root data:TableScan_11 +│ └─TableScan_11 3333.33 cop table:t1, partition:p2, range:(1,+inf], keep order:false, stats:pseudo +├─TableReader_14 3333.33 root data:TableScan_13 +│ └─TableScan_13 3333.33 cop table:t1, partition:p3, range:(1,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:TableScan_15 +│ └─TableScan_15 3333.33 cop table:t1, partition:p4, range:(1,+inf], keep order:false, stats:pseudo +└─TableReader_18 3333.33 root data:TableScan_17 + └─TableScan_17 3333.33 cop table:t1, partition:max, range:(1,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 2 order by a; +a +3 +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a > 2; +id count task operator info +Union_9 10000.00 root +├─TableReader_11 3333.33 root data:TableScan_10 +│ └─TableScan_10 3333.33 cop table:t1, partition:p3, range:(2,+inf], keep order:false, stats:pseudo +├─TableReader_13 3333.33 root data:TableScan_12 +│ └─TableScan_12 3333.33 cop table:t1, partition:p4, range:(2,+inf], keep order:false, stats:pseudo +└─TableReader_15 3333.33 root data:TableScan_14 + └─TableScan_14 3333.33 cop table:t1, partition:max, range:(2,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 3 order by a; +a +4 +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a > 3; +id count task operator info +Union_8 6666.67 root +├─TableReader_10 3333.33 root data:TableScan_9 +│ └─TableScan_9 3333.33 cop table:t1, partition:p4, range:(3,+inf], keep order:false, stats:pseudo +└─TableReader_12 3333.33 root data:TableScan_11 + └─TableScan_11 3333.33 cop table:t1, partition:max, range:(3,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 4 order by a; +a +5 +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a > 4; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:(4,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 5 order by a; +a +6 +7 +EXPLAIN SELECT * FROM t1 WHERE a > 5; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:(5,+inf], keep order:false, stats:pseudo +SELECT * FROM t1 WHERE a > 6 order by a; +a +7 +EXPLAIN SELECT * FROM t1 WHERE a > 6; +id count task operator info +TableReader_7 3333.33 root data:TableScan_6 +└─TableScan_6 3333.33 cop table:t1, partition:max, range:(6,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +# test of RANGE and index +CREATE TABLE t1 (a DATE, KEY(a)) +PARTITION BY RANGE (TO_DAYS(a)) +(PARTITION `pNULL` VALUES LESS THAN (0), +PARTITION `p0001-01-01` VALUES LESS THAN (366 + 1), +PARTITION `p1001-01-01` VALUES LESS THAN (TO_DAYS('1001-01-01') + 1), +PARTITION `p2001-01-01` VALUES LESS THAN (TO_DAYS('2001-01-01') + 1)); +SET SQL_MODE = ''; +INSERT INTO t1 VALUES ('0000-00-00'), ('0000-01-02'), ('0001-01-01'), +('1001-00-00'), ('1001-01-01'), ('1002-00-00'), ('2001-01-01'); +# test without index +ALTER TABLE t1 DROP KEY a; +DROP TABLE t1; +# Test with DATETIME column NOT NULL +CREATE TABLE t1 ( +a int(10) unsigned NOT NULL, +b DATETIME NOT NULL, +PRIMARY KEY (a, b) +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), +PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), +PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), +PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), +PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), +(1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), +(1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), +(1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +# Test with DATE column NOT NULL +CREATE TABLE t1 ( +a int(10) unsigned NOT NULL, +b DATE NOT NULL, +PRIMARY KEY (a, b) +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), +PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), +PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), +PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), +PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), +(1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), +(1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), +(1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop lt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop le(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop ge(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 50000.00 root +├─TableReader_14 10000.00 root data:Selection_13 +│ └─Selection_13 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10000.00 root data:Selection_16 +│ └─Selection_16 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10000.00 root data:Selection_19 +│ └─Selection_19 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10000.00 root data:Selection_22 +│ └─Selection_22 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10000.00 root data:Selection_25 + └─Selection_25 10000.00 cop gt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +# Test with DATETIME column NULL +CREATE TABLE t1 ( +a int(10) unsigned NOT NULL, +b DATETIME NULL +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), +PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), +PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), +PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), +PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), +(1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), +(1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), +(1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +# Test with DATE column NULL +CREATE TABLE t1 ( +a int(10) unsigned NOT NULL, +b DATE NULL +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), +PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), +PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), +PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), +PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), +(1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), +(1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), +(1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-03 00:00:01) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 0.00 root +├─TableReader_14 0.00 root data:Selection_13 +│ └─Selection_13 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 0.00 root data:Selection_16 +│ └─Selection_16 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 0.00 root data:Selection_19 +│ └─Selection_19 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 0.00 root data:Selection_22 +│ └─Selection_22 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 0.00 root data:Selection_25 + └─Selection_25 0.00 cop eq(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +EXPLAIN SELECT * FROM t1 +WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_12 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_18 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) +│ └─TableScan_21 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop gt(test.t1.b, 2009-04-02 23:59:58) + └─TableScan_24 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +# For better code coverage of the patch +CREATE TABLE t1 ( +a int(10) unsigned NOT NULL, +b DATE +) PARTITION BY RANGE ( TO_DAYS(b) ) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), +PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), +PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), +PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), +PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (2, NULL); +# test with an invalid date, which lead to item->null_value is set. +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); +id count task operator info +Selection_11 40000.00 root lt(test.t1.b, cast("2009-04-99")) +└─Union_12 50000.00 root + ├─TableReader_14 10000.00 root data:TableScan_13 + │ └─TableScan_13 10000.00 cop table:t1, partition:p20090401, range:[-inf,+inf], keep order:false, stats:pseudo + ├─TableReader_16 10000.00 root data:TableScan_15 + │ └─TableScan_15 10000.00 cop table:t1, partition:p20090402, range:[-inf,+inf], keep order:false, stats:pseudo + ├─TableReader_18 10000.00 root data:TableScan_17 + │ └─TableScan_17 10000.00 cop table:t1, partition:p20090403, range:[-inf,+inf], keep order:false, stats:pseudo + ├─TableReader_20 10000.00 root data:TableScan_19 + │ └─TableScan_19 10000.00 cop table:t1, partition:p20090404, range:[-inf,+inf], keep order:false, stats:pseudo + └─TableReader_22 10000.00 root data:TableScan_21 + └─TableScan_21 10000.00 cop table:t1, partition:p20090405, range:[-inf,+inf], keep order:false, stats:pseudo +DROP TABLE t1; +CREATE TABLE t1 +(a INT NOT NULL AUTO_INCREMENT, +b DATETIME, +PRIMARY KEY (a,b), +KEY (b)) +PARTITION BY RANGE (to_days(b)) +(PARTITION p0 VALUES LESS THAN (733681) COMMENT = 'LESS THAN 2008-10-01', +PARTITION p1 VALUES LESS THAN (733712) COMMENT = 'LESS THAN 2008-11-01', +PARTITION pX VALUES LESS THAN MAXVALUE); +SELECT a,b FROM t1 WHERE b >= '2008-12-01' AND b < '2009-12-00'; +a b +DROP TABLE t1; +create table t3 ( +a int +) +partition by range (a*1) ( +partition p0 values less than (10), +partition p1 values less than (20) +); +insert into t3 values (5),(15); +explain select * from t3 where a=11; +id count task operator info +Union_8 20.00 root +├─TableReader_11 10.00 root data:Selection_10 +│ └─Selection_10 10.00 cop eq(test.t3.a, 11) +│ └─TableScan_9 10000.00 cop table:t3, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 10.00 root data:Selection_13 + └─Selection_13 10.00 cop eq(test.t3.a, 11) + └─TableScan_12 10000.00 cop table:t3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t3 where a=10; +id count task operator info +Union_8 20.00 root +├─TableReader_11 10.00 root data:Selection_10 +│ └─Selection_10 10.00 cop eq(test.t3.a, 10) +│ └─TableScan_9 10000.00 cop table:t3, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 10.00 root data:Selection_13 + └─Selection_13 10.00 cop eq(test.t3.a, 10) + └─TableScan_12 10000.00 cop table:t3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t3 where a=20; +id count task operator info +Union_8 20.00 root +├─TableReader_11 10.00 root data:Selection_10 +│ └─Selection_10 10.00 cop eq(test.t3.a, 20) +│ └─TableScan_9 10000.00 cop table:t3, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 10.00 root data:Selection_13 + └─Selection_13 10.00 cop eq(test.t3.a, 20) + └─TableScan_12 10000.00 cop table:t3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t3 where a=30; +id count task operator info +Union_8 20.00 root +├─TableReader_11 10.00 root data:Selection_10 +│ └─Selection_10 10.00 cop eq(test.t3.a, 30) +│ └─TableScan_9 10000.00 cop table:t3, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 10.00 root data:Selection_13 + └─Selection_13 10.00 cop eq(test.t3.a, 30) + └─TableScan_12 10000.00 cop table:t3, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +create table t7 (a int not null) partition by RANGE(a) ( +partition p10 values less than (10), +partition p30 values less than (30), +partition p50 values less than (50), +partition p70 values less than (70), +partition p90 values less than (90) +); +insert into t7 values (10),(30),(50); +explain select * from t7 where a < 5; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop lt(test.t7.a, 5) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 9; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop lt(test.t7.a, 9) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 9; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop le(test.t7.a, 9) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 9; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t7.a, 9) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a >= 9; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t7.a, 9) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a > 9; +id count task operator info +Union_10 13333.33 root +├─TableReader_13 3333.33 root data:Selection_12 +│ └─Selection_12 3333.33 cop gt(test.t7.a, 9) +│ └─TableScan_11 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:Selection_15 +│ └─Selection_15 3333.33 cop gt(test.t7.a, 9) +│ └─TableScan_14 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:Selection_18 +│ └─Selection_18 3333.33 cop gt(test.t7.a, 9) +│ └─TableScan_17 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 3333.33 root data:Selection_21 + └─Selection_21 3333.33 cop gt(test.t7.a, 9) + └─TableScan_20 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 10; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop lt(test.t7.a, 10) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 10; +id count task operator info +Union_8 6646.67 root +├─TableReader_11 3323.33 root data:Selection_10 +│ └─Selection_10 3323.33 cop le(test.t7.a, 10) +│ └─TableScan_9 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3323.33 root data:Selection_13 + └─Selection_13 3323.33 cop le(test.t7.a, 10) + └─TableScan_12 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 10; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t7.a, 10) + └─TableScan_6 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a >= 10; +id count task operator info +Union_10 13333.33 root +├─TableReader_13 3333.33 root data:Selection_12 +│ └─Selection_12 3333.33 cop ge(test.t7.a, 10) +│ └─TableScan_11 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:Selection_15 +│ └─Selection_15 3333.33 cop ge(test.t7.a, 10) +│ └─TableScan_14 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:Selection_18 +│ └─Selection_18 3333.33 cop ge(test.t7.a, 10) +│ └─TableScan_17 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 3333.33 root data:Selection_21 + └─Selection_21 3333.33 cop ge(test.t7.a, 10) + └─TableScan_20 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a > 10; +id count task operator info +Union_10 13333.33 root +├─TableReader_13 3333.33 root data:Selection_12 +│ └─Selection_12 3333.33 cop gt(test.t7.a, 10) +│ └─TableScan_11 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:Selection_15 +│ └─Selection_15 3333.33 cop gt(test.t7.a, 10) +│ └─TableScan_14 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:Selection_18 +│ └─Selection_18 3333.33 cop gt(test.t7.a, 10) +│ └─TableScan_17 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 3333.33 root data:Selection_21 + └─Selection_21 3333.33 cop gt(test.t7.a, 10) + └─TableScan_20 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 89; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t7.a, 89) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 89; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t7.a, 89) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 89; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t7.a, 89) + └─TableScan_6 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a > 89; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a >= 89; +id count task operator info +TableReader_8 3333.33 root data:Selection_7 +└─Selection_7 3333.33 cop ge(test.t7.a, 89) + └─TableScan_6 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 90; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t7.a, 90) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 90; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t7.a, 90) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 90; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a > 90; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a >= 90; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a > 91; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a > 11 and a < 29; +id count task operator info +TableReader_8 250.00 root data:Selection_7 +└─Selection_7 250.00 cop gt(test.t7.a, 11), lt(test.t7.a, 29) + └─TableScan_6 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t7; +create table t7 (a int unsigned not null) partition by RANGE(a) ( +partition p10 values less than (10), +partition p30 values less than (30), +partition p50 values less than (50), +partition p70 values less than (70), +partition p90 values less than (90) +); +insert into t7 values (10),(30),(50); +explain select * from t7 where a < 5; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop lt(test.t7.a, 5) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 9; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop lt(test.t7.a, 9) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 9; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop le(test.t7.a, 9) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 9; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t7.a, 9) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a >= 9; +id count task operator info +Union_11 16666.67 root +├─TableReader_14 3333.33 root data:Selection_13 +│ └─Selection_13 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3333.33 root data:Selection_16 +│ └─Selection_16 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3333.33 root data:Selection_19 +│ └─Selection_19 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3333.33 root data:Selection_22 +│ └─Selection_22 3333.33 cop ge(test.t7.a, 9) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3333.33 root data:Selection_25 + └─Selection_25 3333.33 cop ge(test.t7.a, 9) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a > 9; +id count task operator info +Union_10 13333.33 root +├─TableReader_13 3333.33 root data:Selection_12 +│ └─Selection_12 3333.33 cop gt(test.t7.a, 9) +│ └─TableScan_11 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:Selection_15 +│ └─Selection_15 3333.33 cop gt(test.t7.a, 9) +│ └─TableScan_14 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:Selection_18 +│ └─Selection_18 3333.33 cop gt(test.t7.a, 9) +│ └─TableScan_17 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 3333.33 root data:Selection_21 + └─Selection_21 3333.33 cop gt(test.t7.a, 9) + └─TableScan_20 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 10; +id count task operator info +TableReader_8 3323.33 root data:Selection_7 +└─Selection_7 3323.33 cop lt(test.t7.a, 10) + └─TableScan_6 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 10; +id count task operator info +Union_8 6646.67 root +├─TableReader_11 3323.33 root data:Selection_10 +│ └─Selection_10 3323.33 cop le(test.t7.a, 10) +│ └─TableScan_9 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3323.33 root data:Selection_13 + └─Selection_13 3323.33 cop le(test.t7.a, 10) + └─TableScan_12 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 10; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t7.a, 10) + └─TableScan_6 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a >= 10; +id count task operator info +Union_10 13333.33 root +├─TableReader_13 3333.33 root data:Selection_12 +│ └─Selection_12 3333.33 cop ge(test.t7.a, 10) +│ └─TableScan_11 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:Selection_15 +│ └─Selection_15 3333.33 cop ge(test.t7.a, 10) +│ └─TableScan_14 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:Selection_18 +│ └─Selection_18 3333.33 cop ge(test.t7.a, 10) +│ └─TableScan_17 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 3333.33 root data:Selection_21 + └─Selection_21 3333.33 cop ge(test.t7.a, 10) + └─TableScan_20 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a > 10; +id count task operator info +Union_10 13333.33 root +├─TableReader_13 3333.33 root data:Selection_12 +│ └─Selection_12 3333.33 cop gt(test.t7.a, 10) +│ └─TableScan_11 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 3333.33 root data:Selection_15 +│ └─Selection_15 3333.33 cop gt(test.t7.a, 10) +│ └─TableScan_14 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 3333.33 root data:Selection_18 +│ └─Selection_18 3333.33 cop gt(test.t7.a, 10) +│ └─TableScan_17 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 3333.33 root data:Selection_21 + └─Selection_21 3333.33 cop gt(test.t7.a, 10) + └─TableScan_20 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 89; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t7.a, 89) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t7.a, 89) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 89; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t7.a, 89) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t7.a, 89) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 89; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t7.a, 89) + └─TableScan_6 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a > 89; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a >= 89; +id count task operator info +TableReader_8 3333.33 root data:Selection_7 +└─Selection_7 3333.33 cop ge(test.t7.a, 89) + └─TableScan_6 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a < 90; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop lt(test.t7.a, 90) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop lt(test.t7.a, 90) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a <= 90; +id count task operator info +Union_11 16616.67 root +├─TableReader_14 3323.33 root data:Selection_13 +│ └─Selection_13 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_12 10000.00 cop table:t7, partition:p10, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 3323.33 root data:Selection_16 +│ └─Selection_16 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_15 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 3323.33 root data:Selection_19 +│ └─Selection_19 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_18 10000.00 cop table:t7, partition:p50, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 3323.33 root data:Selection_22 +│ └─Selection_22 3323.33 cop le(test.t7.a, 90) +│ └─TableScan_21 10000.00 cop table:t7, partition:p70, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 3323.33 root data:Selection_25 + └─Selection_25 3323.33 cop le(test.t7.a, 90) + └─TableScan_24 10000.00 cop table:t7, partition:p90, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t7 where a = 90; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a > 90; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a >= 90; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a > 91; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t7 where a > 11 and a < 29; +id count task operator info +TableReader_8 250.00 root data:Selection_7 +└─Selection_7 250.00 cop gt(test.t7.a, 11), lt(test.t7.a, 29) + └─TableScan_6 10000.00 cop table:t7, partition:p30, range:[-inf,+inf], keep order:false, stats:pseudo +create table t8 (a date not null) partition by RANGE(YEAR(a)) ( +partition p0 values less than (1980), +partition p1 values less than (1990), +partition p2 values less than (2000) +); +insert into t8 values ('1985-05-05'),('1995-05-05'); +explain select * from t8 where a < '1980-02-02'; +id count task operator info +Union_9 9970.00 root +├─TableReader_12 3323.33 root data:Selection_11 +│ └─Selection_11 3323.33 cop lt(test.t8.a, 1980-02-02 00:00:00.000000) +│ └─TableScan_10 10000.00 cop table:t8, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 3323.33 root data:Selection_14 +│ └─Selection_14 3323.33 cop lt(test.t8.a, 1980-02-02 00:00:00.000000) +│ └─TableScan_13 10000.00 cop table:t8, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 3323.33 root data:Selection_17 + └─Selection_17 3323.33 cop lt(test.t8.a, 1980-02-02 00:00:00.000000) + └─TableScan_16 10000.00 cop table:t8, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( +partition p0 values less than (732299), -- 2004-12-19 +partition p1 values less than (732468), -- 2005-06-06 +partition p2 values less than (732664) -- 2005-12-19 +); +insert into t9 values ('2005-05-05'), ('2005-04-04'); +explain select * from t9 where a < '2004-12-19'; +id count task operator info +Union_9 9970.00 root +├─TableReader_12 3323.33 root data:Selection_11 +│ └─Selection_11 3323.33 cop lt(test.t9.a, 2004-12-19 00:00:00.000000) +│ └─TableScan_10 10000.00 cop table:t9, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 3323.33 root data:Selection_14 +│ └─Selection_14 3323.33 cop lt(test.t9.a, 2004-12-19 00:00:00.000000) +│ └─TableScan_13 10000.00 cop table:t9, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 3323.33 root data:Selection_17 + └─Selection_17 3323.33 cop lt(test.t9.a, 2004-12-19 00:00:00.000000) + └─TableScan_16 10000.00 cop table:t9, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t9 where a <= '2004-12-19'; +id count task operator info +Union_9 9970.00 root +├─TableReader_12 3323.33 root data:Selection_11 +│ └─Selection_11 3323.33 cop le(test.t9.a, 2004-12-19 00:00:00.000000) +│ └─TableScan_10 10000.00 cop table:t9, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 3323.33 root data:Selection_14 +│ └─Selection_14 3323.33 cop le(test.t9.a, 2004-12-19 00:00:00.000000) +│ └─TableScan_13 10000.00 cop table:t9, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 3323.33 root data:Selection_17 + └─Selection_17 3323.33 cop le(test.t9.a, 2004-12-19 00:00:00.000000) + └─TableScan_16 10000.00 cop table:t9, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t7,t8,t9; +create table t1 ( +a1 int not null +) +partition by range (a1) ( +partition p0 values less than (3), +partition p1 values less than (6), +partition p2 values less than (9) +); +insert into t1 values (1),(2),(3); +explain select * from t1 where a1 > 3; +id count task operator info +Union_8 6666.67 root +├─TableReader_11 3333.33 root data:Selection_10 +│ └─Selection_10 3333.33 cop gt(test.t1.a1, 3) +│ └─TableScan_9 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3333.33 root data:Selection_13 + └─Selection_13 3333.33 cop gt(test.t1.a1, 3) + └─TableScan_12 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a1 >= 3; +id count task operator info +Union_8 6666.67 root +├─TableReader_11 3333.33 root data:Selection_10 +│ └─Selection_10 3333.33 cop ge(test.t1.a1, 3) +│ └─TableScan_9 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3333.33 root data:Selection_13 + └─Selection_13 3333.33 cop ge(test.t1.a1, 3) + └─TableScan_12 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a1 < 3 and a1 > 3; +id count task operator info +TableDual_6 0.00 root rows:0 +drop table t1; +CREATE TABLE `t1` ( +`a` int(11) default NULL +); +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +CREATE TABLE `t2` ( +`a` int(11) default NULL, +KEY `a` (`a`) +) ; +insert into t2 select A.a + 10*(B.a + 10* C.a) from t1 A, t1 B, t1 C ; +insert into t1 select a from t2; +drop table t2; +CREATE TABLE `t2` ( +`a` int(11) default NULL, +`b` int(11) default NULL +) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (200), +PARTITION p1 VALUES LESS THAN (400), +PARTITION p2 VALUES LESS THAN (600), +PARTITION p3 VALUES LESS THAN (800), +PARTITION p4 VALUES LESS THAN (1001)); +insert into t2 select a,1 from t1 where a < 200; +insert into t2 select a,2 from t1 where a >= 200 and a < 400; +insert into t2 select a,3 from t1 where a >= 400 and a < 600; +insert into t2 select a,4 from t1 where a >= 600 and a < 800; +insert into t2 select a,5 from t1 where a >= 800 and a < 1001; +explain select * from t2; +id count task operator info +Union_10 50000.00 root +├─TableReader_12 10000.00 root data:TableScan_11 +│ └─TableScan_11 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_14 10000.00 root data:TableScan_13 +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 10000.00 root data:TableScan_15 +│ └─TableScan_15 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_18 10000.00 root data:TableScan_17 +│ └─TableScan_17 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_20 10000.00 root data:TableScan_19 + └─TableScan_19 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a < 801 and a > 200; +id count task operator info +Union_10 1000.00 root +├─TableReader_13 250.00 root data:Selection_12 +│ └─Selection_12 250.00 cop gt(test.t2.a, 200), lt(test.t2.a, 801) +│ └─TableScan_11 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 250.00 root data:Selection_15 +│ └─Selection_15 250.00 cop gt(test.t2.a, 200), lt(test.t2.a, 801) +│ └─TableScan_14 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 250.00 root data:Selection_18 +│ └─Selection_18 250.00 cop gt(test.t2.a, 200), lt(test.t2.a, 801) +│ └─TableScan_17 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 250.00 root data:Selection_21 + └─Selection_21 250.00 cop gt(test.t2.a, 200), lt(test.t2.a, 801) + └─TableScan_20 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a < 801 and a > 800; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t2 where a > 600; +id count task operator info +Union_8 6666.67 root +├─TableReader_11 3333.33 root data:Selection_10 +│ └─Selection_10 3333.33 cop gt(test.t2.a, 600) +│ └─TableScan_9 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3333.33 root data:Selection_13 + └─Selection_13 3333.33 cop gt(test.t2.a, 600) + └─TableScan_12 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a > 600 and b = 1; +id count task operator info +Union_8 6.67 root +├─TableReader_11 3.33 root data:Selection_10 +│ └─Selection_10 3.33 cop eq(test.t2.b, 1), gt(test.t2.a, 600) +│ └─TableScan_9 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3.33 root data:Selection_13 + └─Selection_13 3.33 cop eq(test.t2.b, 1), gt(test.t2.a, 600) + └─TableScan_12 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a > 600 and b = 4; +id count task operator info +Union_8 6.67 root +├─TableReader_11 3.33 root data:Selection_10 +│ └─Selection_10 3.33 cop eq(test.t2.b, 4), gt(test.t2.a, 600) +│ └─TableScan_9 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3.33 root data:Selection_13 + └─Selection_13 3.33 cop eq(test.t2.b, 4), gt(test.t2.a, 600) + └─TableScan_12 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a > 600 and b = 5; +id count task operator info +Union_8 6.67 root +├─TableReader_11 3.33 root data:Selection_10 +│ └─Selection_10 3.33 cop eq(test.t2.b, 5), gt(test.t2.a, 600) +│ └─TableScan_9 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3.33 root data:Selection_13 + └─Selection_13 3.33 cop eq(test.t2.b, 5), gt(test.t2.a, 600) + └─TableScan_12 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where b = 5; +id count task operator info +Union_11 50.00 root +├─TableReader_14 10.00 root data:Selection_13 +│ └─Selection_13 10.00 cop eq(test.t2.b, 5) +│ └─TableScan_12 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_17 10.00 root data:Selection_16 +│ └─Selection_16 10.00 cop eq(test.t2.b, 5) +│ └─TableScan_15 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_20 10.00 root data:Selection_19 +│ └─Selection_19 10.00 cop eq(test.t2.b, 5) +│ └─TableScan_18 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_23 10.00 root data:Selection_22 +│ └─Selection_22 10.00 cop eq(test.t2.b, 5) +│ └─TableScan_21 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_26 10.00 root data:Selection_25 + └─Selection_25 10.00 cop eq(test.t2.b, 5) + └─TableScan_24 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +flush status; +update t2 set b = 100 where b = 6; +show status like 'Handler_read_rnd_next'; +Variable_name Value +flush status; +update t2 set a = 1002 where a = 1001; +show status like 'Handler_read_rnd_next'; +Variable_name Value +flush status; +update t2 set b = 6 where a = 600; +show status like 'Handler_read_rnd_next'; +Variable_name Value +flush status; +update t2 set b = 6 where a > 600 and a < 800; +show status like 'Handler_read_rnd_next'; +Variable_name Value +flush status; +delete from t2 where a > 600; +show status like 'Handler_read_rnd_next'; +Variable_name Value +drop table t2; +CREATE TABLE `t2` ( +`a` int(11) default NULL, +`b` int(11) default NULL, +index (b) +) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (200), +PARTITION p1 VALUES LESS THAN (400), +PARTITION p2 VALUES LESS THAN (600), +PARTITION p3 VALUES LESS THAN (800), +PARTITION p4 VALUES LESS THAN (1001)); +insert into t2 select a,1 from t1 where a < 100; +insert into t2 select a,2 from t1 where a >= 200 and a < 300; +insert into t2 select a,3 from t1 where a >= 300 and a < 400; +insert into t2 select a,4 from t1 where a >= 400 and a < 500; +insert into t2 select a,5 from t1 where a >= 500 and a < 600; +insert into t2 select a,6 from t1 where a >= 600 and a < 700; +insert into t2 select a,7 from t1 where a >= 700 and a < 800; +insert into t2 select a,8 from t1 where a >= 800 and a < 900; +insert into t2 select a,9 from t1 where a >= 900 and a < 1001; +explain select * from t2; +id count task operator info +Union_10 50000.00 root +├─TableReader_12 10000.00 root data:TableScan_11 +│ └─TableScan_11 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_14 10000.00 root data:TableScan_13 +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 10000.00 root data:TableScan_15 +│ └─TableScan_15 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_18 10000.00 root data:TableScan_17 +│ └─TableScan_17 10000.00 cop table:t2, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_20 10000.00 root data:TableScan_19 + └─TableScan_19 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a = 101; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t2.a, 101) + └─TableScan_6 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a = 550; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t2.a, 550) + └─TableScan_6 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a = 833; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t2.a, 833) + └─TableScan_6 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where (a = 100 OR a = 900); +id count task operator info +Union_8 40.00 root +├─TableReader_11 20.00 root data:Selection_10 +│ └─Selection_10 20.00 cop or(eq(test.t2.a, 100), eq(test.t2.a, 900)) +│ └─TableScan_9 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 20.00 root data:Selection_13 + └─Selection_13 20.00 cop or(eq(test.t2.a, 100), eq(test.t2.a, 900)) + └─TableScan_12 10000.00 cop table:t2, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where (a > 100 AND a < 600); +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop gt(test.t2.a, 100), lt(test.t2.a, 600) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop gt(test.t2.a, 100), lt(test.t2.a, 600) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop gt(test.t2.a, 100), lt(test.t2.a, 600) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where b = 4; +id count task operator info +Union_11 50.00 root +├─IndexLookUp_17 10.00 root +│ ├─IndexScan_15 10.00 cop table:t2, partition:p0, index:b, range:[4,4], keep order:false, stats:pseudo +│ └─TableScan_16 10.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 10.00 root +│ ├─IndexScan_21 10.00 cop table:t2, partition:p1, index:b, range:[4,4], keep order:false, stats:pseudo +│ └─TableScan_22 10.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 10.00 root +│ ├─IndexScan_27 10.00 cop table:t2, partition:p2, index:b, range:[4,4], keep order:false, stats:pseudo +│ └─TableScan_28 10.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 10.00 root +│ ├─IndexScan_33 10.00 cop table:t2, partition:p3, index:b, range:[4,4], keep order:false, stats:pseudo +│ └─TableScan_34 10.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 10.00 root + ├─IndexScan_39 10.00 cop table:t2, partition:p4, index:b, range:[4,4], keep order:false, stats:pseudo + └─TableScan_40 10.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b = 6; +id count task operator info +Union_11 50.00 root +├─IndexLookUp_17 10.00 root +│ ├─IndexScan_15 10.00 cop table:t2, partition:p0, index:b, range:[6,6], keep order:false, stats:pseudo +│ └─TableScan_16 10.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 10.00 root +│ ├─IndexScan_21 10.00 cop table:t2, partition:p1, index:b, range:[6,6], keep order:false, stats:pseudo +│ └─TableScan_22 10.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 10.00 root +│ ├─IndexScan_27 10.00 cop table:t2, partition:p2, index:b, range:[6,6], keep order:false, stats:pseudo +│ └─TableScan_28 10.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 10.00 root +│ ├─IndexScan_33 10.00 cop table:t2, partition:p3, index:b, range:[6,6], keep order:false, stats:pseudo +│ └─TableScan_34 10.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 10.00 root + ├─IndexScan_39 10.00 cop table:t2, partition:p4, index:b, range:[6,6], keep order:false, stats:pseudo + └─TableScan_40 10.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b in (1,3,5); +id count task operator info +Union_11 150.00 root +├─IndexLookUp_17 30.00 root +│ ├─IndexScan_15 30.00 cop table:t2, partition:p0, index:b, range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo +│ └─TableScan_16 30.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 30.00 root +│ ├─IndexScan_21 30.00 cop table:t2, partition:p1, index:b, range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo +│ └─TableScan_22 30.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 30.00 root +│ ├─IndexScan_27 30.00 cop table:t2, partition:p2, index:b, range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo +│ └─TableScan_28 30.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 30.00 root +│ ├─IndexScan_33 30.00 cop table:t2, partition:p3, index:b, range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo +│ └─TableScan_34 30.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 30.00 root + ├─IndexScan_39 30.00 cop table:t2, partition:p4, index:b, range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo + └─TableScan_40 30.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b in (2,4,6); +id count task operator info +Union_11 150.00 root +├─IndexLookUp_17 30.00 root +│ ├─IndexScan_15 30.00 cop table:t2, partition:p0, index:b, range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo +│ └─TableScan_16 30.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 30.00 root +│ ├─IndexScan_21 30.00 cop table:t2, partition:p1, index:b, range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo +│ └─TableScan_22 30.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 30.00 root +│ ├─IndexScan_27 30.00 cop table:t2, partition:p2, index:b, range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo +│ └─TableScan_28 30.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 30.00 root +│ ├─IndexScan_33 30.00 cop table:t2, partition:p3, index:b, range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo +│ └─TableScan_34 30.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 30.00 root + ├─IndexScan_39 30.00 cop table:t2, partition:p4, index:b, range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo + └─TableScan_40 30.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b in (7,8,9); +id count task operator info +Union_11 150.00 root +├─IndexLookUp_17 30.00 root +│ ├─IndexScan_15 30.00 cop table:t2, partition:p0, index:b, range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo +│ └─TableScan_16 30.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 30.00 root +│ ├─IndexScan_21 30.00 cop table:t2, partition:p1, index:b, range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo +│ └─TableScan_22 30.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 30.00 root +│ ├─IndexScan_27 30.00 cop table:t2, partition:p2, index:b, range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo +│ └─TableScan_28 30.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 30.00 root +│ ├─IndexScan_33 30.00 cop table:t2, partition:p3, index:b, range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo +│ └─TableScan_34 30.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 30.00 root + ├─IndexScan_39 30.00 cop table:t2, partition:p4, index:b, range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo + └─TableScan_40 30.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b > 5; +id count task operator info +Union_11 16666.67 root +├─IndexLookUp_17 3333.33 root +│ ├─IndexScan_15 3333.33 cop table:t2, partition:p0, index:b, range:(5,+inf], keep order:false, stats:pseudo +│ └─TableScan_16 3333.33 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 3333.33 root +│ ├─IndexScan_21 3333.33 cop table:t2, partition:p1, index:b, range:(5,+inf], keep order:false, stats:pseudo +│ └─TableScan_22 3333.33 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 3333.33 root +│ ├─IndexScan_27 3333.33 cop table:t2, partition:p2, index:b, range:(5,+inf], keep order:false, stats:pseudo +│ └─TableScan_28 3333.33 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 3333.33 root +│ ├─IndexScan_33 3333.33 cop table:t2, partition:p3, index:b, range:(5,+inf], keep order:false, stats:pseudo +│ └─TableScan_34 3333.33 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 3333.33 root + ├─IndexScan_39 3333.33 cop table:t2, partition:p4, index:b, range:(5,+inf], keep order:false, stats:pseudo + └─TableScan_40 3333.33 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b > 5 and b < 8; +id count task operator info +Union_11 1250.00 root +├─IndexLookUp_17 250.00 root +│ ├─IndexScan_15 250.00 cop table:t2, partition:p0, index:b, range:(5,8), keep order:false, stats:pseudo +│ └─TableScan_16 250.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 250.00 root +│ ├─IndexScan_21 250.00 cop table:t2, partition:p1, index:b, range:(5,8), keep order:false, stats:pseudo +│ └─TableScan_22 250.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 250.00 root +│ ├─IndexScan_27 250.00 cop table:t2, partition:p2, index:b, range:(5,8), keep order:false, stats:pseudo +│ └─TableScan_28 250.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 250.00 root +│ ├─IndexScan_33 250.00 cop table:t2, partition:p3, index:b, range:(5,8), keep order:false, stats:pseudo +│ └─TableScan_34 250.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 250.00 root + ├─IndexScan_39 250.00 cop table:t2, partition:p4, index:b, range:(5,8), keep order:false, stats:pseudo + └─TableScan_40 250.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b > 5 and b < 7; +id count task operator info +Union_11 1250.00 root +├─IndexLookUp_17 250.00 root +│ ├─IndexScan_15 250.00 cop table:t2, partition:p0, index:b, range:(5,7), keep order:false, stats:pseudo +│ └─TableScan_16 250.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 250.00 root +│ ├─IndexScan_21 250.00 cop table:t2, partition:p1, index:b, range:(5,7), keep order:false, stats:pseudo +│ └─TableScan_22 250.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 250.00 root +│ ├─IndexScan_27 250.00 cop table:t2, partition:p2, index:b, range:(5,7), keep order:false, stats:pseudo +│ └─TableScan_28 250.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 250.00 root +│ ├─IndexScan_33 250.00 cop table:t2, partition:p3, index:b, range:(5,7), keep order:false, stats:pseudo +│ └─TableScan_34 250.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 250.00 root + ├─IndexScan_39 250.00 cop table:t2, partition:p4, index:b, range:(5,7), keep order:false, stats:pseudo + └─TableScan_40 250.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +explain select * from t2 where b > 0 and b < 5; +id count task operator info +Union_11 1250.00 root +├─IndexLookUp_17 250.00 root +│ ├─IndexScan_15 250.00 cop table:t2, partition:p0, index:b, range:(0,5), keep order:false, stats:pseudo +│ └─TableScan_16 250.00 cop table:t2, partition:p0, keep order:false, stats:pseudo +├─IndexLookUp_23 250.00 root +│ ├─IndexScan_21 250.00 cop table:t2, partition:p1, index:b, range:(0,5), keep order:false, stats:pseudo +│ └─TableScan_22 250.00 cop table:t2, partition:p1, keep order:false, stats:pseudo +├─IndexLookUp_29 250.00 root +│ ├─IndexScan_27 250.00 cop table:t2, partition:p2, index:b, range:(0,5), keep order:false, stats:pseudo +│ └─TableScan_28 250.00 cop table:t2, partition:p2, keep order:false, stats:pseudo +├─IndexLookUp_35 250.00 root +│ ├─IndexScan_33 250.00 cop table:t2, partition:p3, index:b, range:(0,5), keep order:false, stats:pseudo +│ └─TableScan_34 250.00 cop table:t2, partition:p3, keep order:false, stats:pseudo +└─IndexLookUp_41 250.00 root + ├─IndexScan_39 250.00 cop table:t2, partition:p4, index:b, range:(0,5), keep order:false, stats:pseudo + └─TableScan_40 250.00 cop table:t2, partition:p4, keep order:false, stats:pseudo +flush status; +update t2 set a = 111 where b = 10; +show status like 'Handler_read_rnd_next'; +Variable_name Value +show status like 'Handler_read_key'; +Variable_name Value +flush status; +update t2 set a = 111 where b in (5,6); +show status like 'Handler_read_rnd_next'; +Variable_name Value +show status like 'Handler_read_key'; +Variable_name Value +flush status; +update t2 set a = 222 where b = 7; +show status like 'Handler_read_rnd_next'; +Variable_name Value +show status like 'Handler_read_key'; +Variable_name Value +flush status; +delete from t2 where b = 7; +show status like 'Handler_read_rnd_next'; +Variable_name Value +show status like 'Handler_read_key'; +Variable_name Value +flush status; +delete from t2 where b > 5; +show status like 'Handler_read_rnd_next'; +Variable_name Value +show status like 'Handler_read_key'; +Variable_name Value +show status like 'Handler_read_prev'; +Variable_name Value +show status like 'Handler_read_next'; +Variable_name Value +flush status; +delete from t2 where b < 5 or b > 3; +show status like 'Handler_read_rnd_next'; +Variable_name Value +show status like 'Handler_read_key'; +Variable_name Value +show status like 'Handler_read_prev'; +Variable_name Value +show status like 'Handler_read_next'; +Variable_name Value +drop table t1, t2; +create table t1 (s1 int); +explain select 1 from t1 union all select 2; +id count task operator info +Union_8 10001.00 root +├─Projection_10 10000.00 root 1 +│ └─TableReader_12 10000.00 root data:TableScan_11 +│ └─TableScan_11 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo +└─Projection_14 1.00 root 2 + └─TableDual_15 1.00 root rows:1 +drop table t1; +create table t1 (a int) +partition by range(a) ( +partition p0 values less than (64), +partition p1 values less than (128), +partition p2 values less than (255) +); +create table t2 (a int) +partition by range(a+0) ( +partition p0 values less than (64), +partition p1 values less than (128), +partition p2 values less than (255) +); +insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); +insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); +explain select * from t1 where a=0; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t1.a, 0) + └─TableScan_6 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a=0; +id count task operator info +Union_9 30.00 root +├─TableReader_12 10.00 root data:Selection_11 +│ └─Selection_11 10.00 cop eq(test.t2.a, 0) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 10.00 root data:Selection_14 +│ └─Selection_14 10.00 cop eq(test.t2.a, 0) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 10.00 root data:Selection_17 + └─Selection_17 10.00 cop eq(test.t2.a, 0) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a=0xFE; +id count task operator info +TableReader_8 10.00 root data:Selection_7 +└─Selection_7 10.00 cop eq(test.t1.a, 254) + └─TableScan_6 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a=0xFE; +id count task operator info +Union_9 30.00 root +├─TableReader_12 10.00 root data:Selection_11 +│ └─Selection_11 10.00 cop eq(test.t2.a, 254) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 10.00 root data:Selection_14 +│ └─Selection_14 10.00 cop eq(test.t2.a, 254) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 10.00 root data:Selection_17 + └─Selection_17 10.00 cop eq(test.t2.a, 254) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a > 0xFE AND a <= 0xFF; +id count task operator info +TableDual_6 0.00 root rows:0 +explain select * from t2 where a > 0xFE AND a <= 0xFF; +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop gt(test.t2.a, 254), le(test.t2.a, 255) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop gt(test.t2.a, 254), le(test.t2.a, 255) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop gt(test.t2.a, 254), le(test.t2.a, 255) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a >= 0xFE AND a <= 0xFF; +id count task operator info +TableReader_8 250.00 root data:Selection_7 +└─Selection_7 250.00 cop ge(test.t1.a, 254), le(test.t1.a, 255) + └─TableScan_6 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a >= 0xFE AND a <= 0xFF; +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop ge(test.t2.a, 254), le(test.t2.a, 255) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop ge(test.t2.a, 254), le(test.t2.a, 255) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop ge(test.t2.a, 254), le(test.t2.a, 255) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a < 64 AND a >= 63; +id count task operator info +TableReader_8 250.00 root data:Selection_7 +└─Selection_7 250.00 cop ge(test.t1.a, 63), lt(test.t1.a, 64) + └─TableScan_6 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a < 64 AND a >= 63; +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop ge(test.t2.a, 63), lt(test.t2.a, 64) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop ge(test.t2.a, 63), lt(test.t2.a, 64) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop ge(test.t2.a, 63), lt(test.t2.a, 64) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a <= 64 AND a >= 63; +id count task operator info +Union_8 500.00 root +├─TableReader_11 250.00 root data:Selection_10 +│ └─Selection_10 250.00 cop ge(test.t1.a, 63), le(test.t1.a, 64) +│ └─TableScan_9 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 250.00 root data:Selection_13 + └─Selection_13 250.00 cop ge(test.t1.a, 63), le(test.t1.a, 64) + └─TableScan_12 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t2 where a <= 64 AND a >= 63; +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop ge(test.t2.a, 63), le(test.t2.a, 64) +│ └─TableScan_10 10000.00 cop table:t2, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop ge(test.t2.a, 63), le(test.t2.a, 64) +│ └─TableScan_13 10000.00 cop table:t2, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop ge(test.t2.a, 63), le(test.t2.a, 64) + └─TableScan_16 10000.00 cop table:t2, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t1; +drop table t2; +create table t1(a bigint unsigned not null) partition by range(a+0) ( +partition p1 values less than (10), +partition p2 values less than (20), +partition p3 values less than (2305561538531885056), +partition p4 values less than (2305561538531950591) +); +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); +explain select * from t1 where +a >= 2305561538531885056-10 and a <= 2305561538531885056-8; +id count task operator info +Union_10 1000.00 root +├─TableReader_13 250.00 root data:Selection_12 +│ └─Selection_12 250.00 cop ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) +│ └─TableScan_11 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 250.00 root data:Selection_15 +│ └─Selection_15 250.00 cop ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) +│ └─TableScan_14 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 250.00 root data:Selection_18 +│ └─Selection_18 250.00 cop ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) +│ └─TableScan_17 10000.00 cop table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 250.00 root data:Selection_21 + └─Selection_21 250.00 cop ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) + └─TableScan_20 10000.00 cop table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where +a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; +id count task operator info +Union_10 1000.00 root +├─TableReader_13 250.00 root data:Selection_12 +│ └─Selection_12 250.00 cop gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) +│ └─TableScan_11 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 250.00 root data:Selection_15 +│ └─Selection_15 250.00 cop gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) +│ └─TableScan_14 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 250.00 root data:Selection_18 +│ └─Selection_18 250.00 cop gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) +│ └─TableScan_17 10000.00 cop table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 250.00 root data:Selection_21 + └─Selection_21 250.00 cop gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) + └─TableScan_20 10000.00 cop table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; +id count task operator info +Union_10 1000.00 root +├─TableReader_13 250.00 root data:Selection_12 +│ └─Selection_12 250.00 cop ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) +│ └─TableScan_11 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 250.00 root data:Selection_15 +│ └─Selection_15 250.00 cop ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) +│ └─TableScan_14 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 250.00 root data:Selection_18 +│ └─Selection_18 250.00 cop ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) +│ └─TableScan_17 10000.00 cop table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 250.00 root data:Selection_21 + └─Selection_21 250.00 cop ge(test.t1.a, 0), le(test.t1.a, 18446744073709551615) + └─TableScan_20 10000.00 cop table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t1; +create table t1 (a bigint) partition by range(a+0) ( +partition p1 values less than (-1000), +partition p2 values less than (-10), +partition p3 values less than (10), +partition p4 values less than (1000) +); +insert into t1 values (-15),(-5),(5),(15),(-15),(-5),(5),(15); +explain select * from t1 where a>-2 and a <=0; +id count task operator info +Union_10 1000.00 root +├─TableReader_13 250.00 root data:Selection_12 +│ └─Selection_12 250.00 cop gt(test.t1.a, -2), le(test.t1.a, 0) +│ └─TableScan_11 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_16 250.00 root data:Selection_15 +│ └─Selection_15 250.00 cop gt(test.t1.a, -2), le(test.t1.a, 0) +│ └─TableScan_14 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_19 250.00 root data:Selection_18 +│ └─Selection_18 250.00 cop gt(test.t1.a, -2), le(test.t1.a, 0) +│ └─TableScan_17 10000.00 cop table:t1, partition:p3, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_22 250.00 root data:Selection_21 + └─Selection_21 250.00 cop gt(test.t1.a, -2), le(test.t1.a, 0) + └─TableScan_20 10000.00 cop table:t1, partition:p4, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t1; +CREATE TABLE t1 ( recdate DATETIME NOT NULL ) +PARTITION BY RANGE( TO_DAYS(recdate) ) ( +PARTITION p0 VALUES LESS THAN ( TO_DAYS('2007-03-08') ), +PARTITION p1 VALUES LESS THAN ( TO_DAYS('2007-04-01') ) +); +INSERT INTO t1 VALUES ('2007-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2007-03-07 12:00:00'); +INSERT INTO t1 VALUES ('2007-03-08 12:00:00'); +INSERT INTO t1 VALUES ('2007-03-15 12:00:00'); +explain select * from t1 where recdate < '2007-03-08 00:00:00'; +id count task operator info +Union_8 6646.67 root +├─TableReader_11 3323.33 root data:Selection_10 +│ └─Selection_10 3323.33 cop lt(test.t1.recdate, 2007-03-08 00:00:00.000000) +│ └─TableScan_9 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3323.33 root data:Selection_13 + └─Selection_13 3323.33 cop lt(test.t1.recdate, 2007-03-08 00:00:00.000000) + └─TableScan_12 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t1; +CREATE TABLE t1 ( recdate DATETIME NOT NULL ) +PARTITION BY RANGE( YEAR(recdate) ) ( +PARTITION p0 VALUES LESS THAN (2006), +PARTITION p1 VALUES LESS THAN (2007) +); +INSERT INTO t1 VALUES ('2005-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2005-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); +explain select * from t1 where recdate < '2006-01-01 00:00:00'; +id count task operator info +Union_8 6646.67 root +├─TableReader_11 3323.33 root data:Selection_10 +│ └─Selection_10 3323.33 cop lt(test.t1.recdate, 2006-01-01 00:00:00.000000) +│ └─TableScan_9 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_14 3323.33 root data:Selection_13 + └─Selection_13 3323.33 cop lt(test.t1.recdate, 2006-01-01 00:00:00.000000) + └─TableScan_12 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t1; +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int) +partition by range(a+0) ( +partition p0 values less than (64), +partition p1 values less than (128), +partition p2 values less than (255) +); +insert into t1 select A.a + 10*B.a from t0 A, t0 B; +explain select * from t1 where a between 10 and 13; +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop ge(test.t1.a, 10), le(test.t1.a, 13) +│ └─TableScan_10 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop ge(test.t1.a, 10), le(test.t1.a, 13) +│ └─TableScan_13 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop ge(test.t1.a, 10), le(test.t1.a, 13) + └─TableScan_16 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +explain select * from t1 where a between 10 and 10+33; +id count task operator info +Union_9 750.00 root +├─TableReader_12 250.00 root data:Selection_11 +│ └─Selection_11 250.00 cop ge(test.t1.a, 10), le(test.t1.a, 43) +│ └─TableScan_10 10000.00 cop table:t1, partition:p0, range:[-inf,+inf], keep order:false, stats:pseudo +├─TableReader_15 250.00 root data:Selection_14 +│ └─Selection_14 250.00 cop ge(test.t1.a, 10), le(test.t1.a, 43) +│ └─TableScan_13 10000.00 cop table:t1, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo +└─TableReader_18 250.00 root data:Selection_17 + └─Selection_17 250.00 cop ge(test.t1.a, 10), le(test.t1.a, 43) + └─TableScan_16 10000.00 cop table:t1, partition:p2, range:[-inf,+inf], keep order:false, stats:pseudo +drop table t0, t1; diff --git a/cmd/explaintest/r/tpch.result b/cmd/explaintest/r/tpch.result index 13f86446e1566..72211fa37bbd1 100644 --- a/cmd/explaintest/r/tpch.result +++ b/cmd/explaintest/r/tpch.result @@ -251,7 +251,7 @@ limit 10; id count task operator info Projection_14 10.00 root tpch.lineitem.l_orderkey, 7_col_0, tpch.orders.o_orderdate, tpch.orders.o_shippriority └─TopN_17 10.00 root 7_col_0:desc, tpch.orders.o_orderdate:asc, offset:0, count:10 - └─HashAgg_20 40256361.71 root group by:tpch.lineitem.l_orderkey, tpch.orders.o_orderdate, tpch.orders.o_shippriority, funcs:sum(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))), firstrow(tpch.orders.o_orderdate), firstrow(tpch.orders.o_shippriority), firstrow(tpch.lineitem.l_orderkey) + └─HashAgg_20 40227041.09 root group by:tpch.lineitem.l_orderkey, tpch.orders.o_orderdate, tpch.orders.o_shippriority, funcs:sum(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))), firstrow(tpch.orders.o_orderdate), firstrow(tpch.orders.o_shippriority), firstrow(tpch.lineitem.l_orderkey) └─IndexJoin_26 91515927.49 root inner join, inner:IndexLookUp_25, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey ├─HashRightJoin_46 22592975.51 root inner join, inner:TableReader_52, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] │ ├─TableReader_52 1498236.00 root data:Selection_51 @@ -260,9 +260,9 @@ Projection_14 10.00 root tpch.lineitem.l_orderkey, 7_col_0, tpch.orders.o_orderd │ └─TableReader_49 36870000.00 root data:Selection_48 │ └─Selection_48 36870000.00 cop lt(tpch.orders.o_orderdate, 1995-03-13 00:00:00.000000) │ └─TableScan_47 75000000.00 cop table:orders, range:[-inf,+inf], keep order:false - └─IndexLookUp_25 163063881.42 root + └─IndexLookUp_25 162945114.27 root ├─IndexScan_22 1.00 cop table:lineitem, index:L_ORDERKEY, L_LINENUMBER, range: decided by [tpch.orders.o_orderkey], keep order:false - └─Selection_24 163063881.42 cop gt(tpch.lineitem.l_shipdate, 1995-03-13 00:00:00.000000) + └─Selection_24 162945114.27 cop gt(tpch.lineitem.l_shipdate, 1995-03-13 00:00:00.000000) └─TableScan_23 1.00 cop table:lineitem, keep order:false /* Q4 Order Priority Checking Query @@ -922,13 +922,13 @@ p_brand, p_type, p_size; id count task operator info -Sort_13 15.00 root supplier_cnt:desc, tpch.part.p_brand:asc, tpch.part.p_type:asc, tpch.part.p_size:asc -└─Projection_14 15.00 root tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size, 9_col_0 - └─HashAgg_17 15.00 root group by:tpch.part.p_brand, tpch.part.p_size, tpch.part.p_type, funcs:count(distinct tpch.partsupp.ps_suppkey), firstrow(tpch.part.p_brand), firstrow(tpch.part.p_type), firstrow(tpch.part.p_size) - └─HashLeftJoin_22 4022816.68 root anti semi join, inner:TableReader_46, equal:[eq(tpch.partsupp.ps_suppkey, tpch.supplier.s_suppkey)] - ├─IndexJoin_26 5028520.85 root inner join, inner:IndexReader_25, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey - │ ├─TableReader_41 1249969.60 root data:Selection_40 - │ │ └─Selection_40 1249969.60 cop in(tpch.part.p_size, 48, 19, 12, 4, 41, 7, 21, 39), ne(tpch.part.p_brand, "Brand#34"), not(like(tpch.part.p_type, "LARGE BRUSHED%", 92)) +Sort_13 14.41 root supplier_cnt:desc, tpch.part.p_brand:asc, tpch.part.p_type:asc, tpch.part.p_size:asc +└─Projection_14 14.41 root tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size, 9_col_0 + └─HashAgg_17 14.41 root group by:tpch.part.p_brand, tpch.part.p_size, tpch.part.p_type, funcs:count(distinct tpch.partsupp.ps_suppkey), firstrow(tpch.part.p_brand), firstrow(tpch.part.p_type), firstrow(tpch.part.p_size) + └─HashLeftJoin_22 3863988.24 root anti semi join, inner:TableReader_46, equal:[eq(tpch.partsupp.ps_suppkey, tpch.supplier.s_suppkey)] + ├─IndexJoin_26 4829985.30 root inner join, inner:IndexReader_25, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey + │ ├─TableReader_41 1200618.43 root data:Selection_40 + │ │ └─Selection_40 1200618.43 cop in(tpch.part.p_size, 48, 19, 12, 4, 41, 7, 21, 39), ne(tpch.part.p_brand, "Brand#34"), not(like(tpch.part.p_type, "LARGE BRUSHED%", 92)) │ │ └─TableScan_39 10000000.00 cop table:part, range:[-inf,+inf], keep order:false │ └─IndexReader_25 1.00 root index:IndexScan_24 │ └─IndexScan_24 1.00 cop table:partsupp, index:PS_PARTKEY, PS_SUPPKEY, range: decided by [tpch.part.p_partkey], keep order:false diff --git a/cmd/explaintest/t/explain_easy.test b/cmd/explaintest/t/explain_easy.test index 23214476f20aa..f8ca1c8bb1dc8 100644 --- a/cmd/explaintest/t/explain_easy.test +++ b/cmd/explaintest/t/explain_easy.test @@ -81,3 +81,22 @@ begin; insert tb values ('1'); explain select * from ta where a = 1; rollback; + +# https://github.com/pingcap/tidb/issues/7918 +drop table if exists t; +create table t(a int, nb int not null, nc int not null); +explain select ifnull(a, 0) from t; +explain select ifnull(nb, 0) from t; +explain select ifnull(nb, 0), ifnull(nc, 0) from t; +explain select ifnull(a, 0), ifnull(nb, 0) from t; +explain select ifnull(nb, 0), ifnull(nb, 0) from t; +explain select 1+ifnull(nb, 0) from t; +explain select 1+ifnull(a, 0) from t; +drop table if exists t; +drop table if exists t; +create table t(a int); +explain select * from t where _tidb_rowid = 0; +explain select * from t where _tidb_rowid > 0; +explain select a, _tidb_rowid from t where a > 0; +explain select * from t where _tidb_rowid > 0 and a > 0; +drop table if exists t; diff --git a/cmd/explaintest/t/partition_pruning.test b/cmd/explaintest/t/partition_pruning.test new file mode 100644 index 0000000000000..c96261288b8e6 --- /dev/null +++ b/cmd/explaintest/t/partition_pruning.test @@ -0,0 +1,944 @@ +set @@session.tidb_enable_table_partition=1; +# +# Partition pruning tests. Currently we only detect which partitions to +# prune, so the test is EXPLAINs. +# +-- source include/have_partition.inc + +--disable_warnings +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +--enable_warnings + +--echo # +--echo # Bug#53806: Wrong estimates for range query in partitioned MyISAM table +--echo # Bug#46754: 'rows' field doesn't reflect partition pruning +--echo # +CREATE TABLE t1 (a INT PRIMARY KEY) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (1), +PARTITION p1 VALUES LESS THAN (2), +PARTITION p2 VALUES LESS THAN (3), +PARTITION p3 VALUES LESS THAN (4), +PARTITION p4 VALUES LESS THAN (5), +PARTITION p5 VALUES LESS THAN (6), +PARTITION max VALUES LESS THAN MAXVALUE); + +INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); + +--replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 11 # +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +--replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 11 # +EXPLAIN SELECT * FROM t1 WHERE a < 7; +--replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 11 # +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +DROP TABLE t1; + +--echo # +--echo # Bug#49742: Partition Pruning not working correctly for RANGE +--echo # +CREATE TABLE t1 (a INT PRIMARY KEY) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (1), +PARTITION p1 VALUES LESS THAN (2), +PARTITION p2 VALUES LESS THAN (3), +PARTITION p3 VALUES LESS THAN (4), +PARTITION p4 VALUES LESS THAN (5), +PARTITION p5 VALUES LESS THAN (6), +PARTITION max VALUES LESS THAN MAXVALUE); + +INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); + +SELECT * FROM t1 WHERE a < 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 1; +SELECT * FROM t1 WHERE a < 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 2; +SELECT * FROM t1 WHERE a < 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 3; +SELECT * FROM t1 WHERE a < 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 4; +SELECT * FROM t1 WHERE a < 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 5; +SELECT * FROM t1 WHERE a < 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 6; +SELECT * FROM t1 WHERE a < 7 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 7; +SELECT * FROM t1 WHERE a <= 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +SELECT * FROM t1 WHERE a <= 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 2; +SELECT * FROM t1 WHERE a <= 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 3; +SELECT * FROM t1 WHERE a <= 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 4; +SELECT * FROM t1 WHERE a <= 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 5; +SELECT * FROM t1 WHERE a <= 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 6; +SELECT * FROM t1 WHERE a <= 7 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 7; +SELECT * FROM t1 WHERE a = 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 1; +SELECT * FROM t1 WHERE a = 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 2; +SELECT * FROM t1 WHERE a = 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 3; +SELECT * FROM t1 WHERE a = 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 4; +SELECT * FROM t1 WHERE a = 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 5; +SELECT * FROM t1 WHERE a = 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 6; +SELECT * FROM t1 WHERE a = 7 order by a; +EXPLAIN SELECT * FROM t1 WHERE a = 7; +SELECT * FROM t1 WHERE a >= 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 1; +SELECT * FROM t1 WHERE a >= 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 2; +SELECT * FROM t1 WHERE a >= 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 3; +SELECT * FROM t1 WHERE a >= 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 4; +SELECT * FROM t1 WHERE a >= 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 5; +SELECT * FROM t1 WHERE a >= 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 6; +SELECT * FROM t1 WHERE a >= 7 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 7; +SELECT * FROM t1 WHERE a > 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 1; +SELECT * FROM t1 WHERE a > 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 2; +SELECT * FROM t1 WHERE a > 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 3; +SELECT * FROM t1 WHERE a > 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 4; +SELECT * FROM t1 WHERE a > 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 5; +SELECT * FROM t1 WHERE a > 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 6; +SELECT * FROM t1 WHERE a > 7 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 7; +DROP TABLE t1; + +CREATE TABLE t1 (a INT PRIMARY KEY) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (1), +PARTITION p1 VALUES LESS THAN (2), +PARTITION p2 VALUES LESS THAN (3), +PARTITION p3 VALUES LESS THAN (4), +PARTITION p4 VALUES LESS THAN (5), +PARTITION max VALUES LESS THAN MAXVALUE); + +INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7); + +SELECT * FROM t1 WHERE a < 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 1; +SELECT * FROM t1 WHERE a < 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 2; +SELECT * FROM t1 WHERE a < 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 3; +SELECT * FROM t1 WHERE a < 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 4; +SELECT * FROM t1 WHERE a < 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 5; +SELECT * FROM t1 WHERE a < 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a < 6; +SELECT * FROM t1 WHERE a <= 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 1; +SELECT * FROM t1 WHERE a <= 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 2; +SELECT * FROM t1 WHERE a <= 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 3; +SELECT * FROM t1 WHERE a <= 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 4; +SELECT * FROM t1 WHERE a <= 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 5; +SELECT * FROM t1 WHERE a <= 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a <= 6; +SELECT * FROM t1 WHERE a = 1; +EXPLAIN SELECT * FROM t1 WHERE a = 1; +SELECT * FROM t1 WHERE a = 2; +EXPLAIN SELECT * FROM t1 WHERE a = 2; +SELECT * FROM t1 WHERE a = 3; +EXPLAIN SELECT * FROM t1 WHERE a = 3; +SELECT * FROM t1 WHERE a = 4; +EXPLAIN SELECT * FROM t1 WHERE a = 4; +SELECT * FROM t1 WHERE a = 5; +EXPLAIN SELECT * FROM t1 WHERE a = 5; +SELECT * FROM t1 WHERE a = 6; +EXPLAIN SELECT * FROM t1 WHERE a = 6; +SELECT * FROM t1 WHERE a >= 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 1; +SELECT * FROM t1 WHERE a >= 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 2; +SELECT * FROM t1 WHERE a >= 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 3; +SELECT * FROM t1 WHERE a >= 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 4; +SELECT * FROM t1 WHERE a >= 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 5; +SELECT * FROM t1 WHERE a >= 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a >= 6; +SELECT * FROM t1 WHERE a > 1 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 1; +SELECT * FROM t1 WHERE a > 2 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 2; +SELECT * FROM t1 WHERE a > 3 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 3; +SELECT * FROM t1 WHERE a > 4 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 4; +SELECT * FROM t1 WHERE a > 5 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 5; +SELECT * FROM t1 WHERE a > 6 order by a; +EXPLAIN SELECT * FROM t1 WHERE a > 6; +DROP TABLE t1; + +# +# Bug#20577: Partitions: use of to_days() function leads to selection failures +# +--echo # test of RANGE and index +CREATE TABLE t1 (a DATE, KEY(a)) +PARTITION BY RANGE (TO_DAYS(a)) +(PARTITION `pNULL` VALUES LESS THAN (0), + PARTITION `p0001-01-01` VALUES LESS THAN (366 + 1), + PARTITION `p1001-01-01` VALUES LESS THAN (TO_DAYS('1001-01-01') + 1), + PARTITION `p2001-01-01` VALUES LESS THAN (TO_DAYS('2001-01-01') + 1)); +SET SQL_MODE = ''; +INSERT INTO t1 VALUES ('0000-00-00'), ('0000-01-02'), ('0001-01-01'), + ('1001-00-00'), ('1001-01-01'), ('1002-00-00'), ('2001-01-01'); +--source include/partition_date_range.inc +--echo # test without index +ALTER TABLE t1 DROP KEY a; +--source include/partition_date_range.inc +DROP TABLE t1; + + +# +# Bug#46362: Endpoint should be set to false for TO_DAYS(DATE) +# There is a problem when comparing DATE with DATETIME. +# In pruning it is converted into the field type +# and in row evaluation it is converted to longlong +# (like a DATETIME). +--echo # Test with DATETIME column NOT NULL +CREATE TABLE t1 ( + a int(10) unsigned NOT NULL, + b DATETIME NOT NULL, + PRIMARY KEY (a, b) +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), + PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), + PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), + PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), + PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), + (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), + (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), + (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +DROP TABLE t1; + +--echo # Test with DATE column NOT NULL +CREATE TABLE t1 ( + a int(10) unsigned NOT NULL, + b DATE NOT NULL, + PRIMARY KEY (a, b) +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), + PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), + PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), + PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), + PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), + (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), + (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), + (1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +DROP TABLE t1; + +--echo # Test with DATETIME column NULL +CREATE TABLE t1 ( + a int(10) unsigned NOT NULL, + b DATETIME NULL +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), + PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), + PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), + PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), + PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), + (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), + (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), + (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +DROP TABLE t1; + +--echo # Test with DATE column NULL +CREATE TABLE t1 ( + a int(10) unsigned NOT NULL, + b DATE NULL +) PARTITION BY RANGE (TO_DAYS(b)) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), + PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), + PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), + PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), + PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), + (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), + (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), + (1, '2009-04-07'); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; +EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); +EXPLAIN SELECT * FROM t1 + WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); +DROP TABLE t1; + +--echo # For better code coverage of the patch +CREATE TABLE t1 ( + a int(10) unsigned NOT NULL, + b DATE +) PARTITION BY RANGE ( TO_DAYS(b) ) +(PARTITION p20090401 VALUES LESS THAN (TO_DAYS('2009-04-02')), + PARTITION p20090402 VALUES LESS THAN (TO_DAYS('2009-04-03')), + PARTITION p20090403 VALUES LESS THAN (TO_DAYS('2009-04-04')), + PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), + PARTITION p20090405 VALUES LESS THAN MAXVALUE); +INSERT INTO t1 VALUES (1, '2009-01-01'), (2, NULL); +--echo # test with an invalid date, which lead to item->null_value is set. +EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); +DROP TABLE t1; + +# +# Bug#40972: some sql execution lead the whole database crashing +# +# Setup so the start is at partition pX and end is at p1 +# Pruning does handle 'bad' dates differently. +CREATE TABLE t1 +(a INT NOT NULL AUTO_INCREMENT, + b DATETIME, + PRIMARY KEY (a,b), + KEY (b)) +PARTITION BY RANGE (to_days(b)) +(PARTITION p0 VALUES LESS THAN (733681) COMMENT = 'LESS THAN 2008-10-01', + PARTITION p1 VALUES LESS THAN (733712) COMMENT = 'LESS THAN 2008-11-01', + PARTITION pX VALUES LESS THAN MAXVALUE); +SELECT a,b FROM t1 WHERE b >= '2008-12-01' AND b < '2009-12-00'; +DROP TABLE t1; + +# RANGE(expr) partitioning +create table t3 ( + a int +) +partition by range (a*1) ( + partition p0 values less than (10), + partition p1 values less than (20) +); +insert into t3 values (5),(15); + +explain select * from t3 where a=11; +explain select * from t3 where a=10; +explain select * from t3 where a=20; + +explain select * from t3 where a=30; + +# RANGE(field) partitioning, interval analysis. +create table t7 (a int not null) partition by RANGE(a) ( + partition p10 values less than (10), + partition p30 values less than (30), + partition p50 values less than (50), + partition p70 values less than (70), + partition p90 values less than (90) +); +insert into t7 values (10),(30),(50); + +# leftmost intervals +explain select * from t7 where a < 5; +explain select * from t7 where a < 9; +explain select * from t7 where a <= 9; +explain select * from t7 where a = 9; +explain select * from t7 where a >= 9; +explain select * from t7 where a > 9; +explain select * from t7 where a < 10; +explain select * from t7 where a <= 10; +explain select * from t7 where a = 10; +explain select * from t7 where a >= 10; +explain select * from t7 where a > 10; + +#rightmost intervals +explain select * from t7 where a < 89; +explain select * from t7 where a <= 89; +explain select * from t7 where a = 89; +explain select * from t7 where a > 89; +explain select * from t7 where a >= 89; +explain select * from t7 where a < 90; +explain select * from t7 where a <= 90; +explain select * from t7 where a = 90; +explain select * from t7 where a > 90; +explain select * from t7 where a >= 90; +explain select * from t7 where a > 91; + +# misc intervals +explain select * from t7 where a > 11 and a < 29; + +drop table t7; + +create table t7 (a int unsigned not null) partition by RANGE(a) ( + partition p10 values less than (10), + partition p30 values less than (30), + partition p50 values less than (50), + partition p70 values less than (70), + partition p90 values less than (90) +); +insert into t7 values (10),(30),(50); + +# leftmost intervals +explain select * from t7 where a < 5; +explain select * from t7 where a < 9; +explain select * from t7 where a <= 9; +explain select * from t7 where a = 9; +explain select * from t7 where a >= 9; +explain select * from t7 where a > 9; +explain select * from t7 where a < 10; +explain select * from t7 where a <= 10; +explain select * from t7 where a = 10; +explain select * from t7 where a >= 10; +explain select * from t7 where a > 10; + +#rightmost intervals +explain select * from t7 where a < 89; +explain select * from t7 where a <= 89; +explain select * from t7 where a = 89; +explain select * from t7 where a > 89; +explain select * from t7 where a >= 89; +explain select * from t7 where a < 90; +explain select * from t7 where a <= 90; +explain select * from t7 where a = 90; +explain select * from t7 where a > 90; +explain select * from t7 where a >= 90; +explain select * from t7 where a > 91; + +# misc intervals +explain select * from t7 where a > 11 and a < 29; + +# LIST(monontonic_func) partitioning +create table t8 (a date not null) partition by RANGE(YEAR(a)) ( + partition p0 values less than (1980), + partition p1 values less than (1990), + partition p2 values less than (2000) +); +insert into t8 values ('1985-05-05'),('1995-05-05'); + +explain select * from t8 where a < '1980-02-02'; + +# LIST(strict_monotonic_func) partitioning +create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( + partition p0 values less than (732299), -- 2004-12-19 + partition p1 values less than (732468), -- 2005-06-06 + partition p2 values less than (732664) -- 2005-12-19 +); +insert into t9 values ('2005-05-05'), ('2005-04-04'); + +explain select * from t9 where a < '2004-12-19'; +explain select * from t9 where a <= '2004-12-19'; + +drop table t7,t8,t9; + +# +# Test cases for bugs found in code review: +# +create table t1 ( + a1 int not null +) +partition by range (a1) ( + partition p0 values less than (3), + partition p1 values less than (6), + partition p2 values less than (9) +); +insert into t1 values (1),(2),(3); +explain select * from t1 where a1 > 3; +explain select * from t1 where a1 >= 3; + +explain select * from t1 where a1 < 3 and a1 > 3; +drop table t1; + +# Test partition pruning for single-table UPDATE/DELETE. +# TODO: Currently we test only "all partitions pruned away" case. Add more +# tests when the patch that makes use of partition pruning results at +# execution phase is pushed. + +# +# WL#2986 Tests (Checking if partition pruning results are used at query +# execution phase) +# +CREATE TABLE `t1` ( + `a` int(11) default NULL +); +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +CREATE TABLE `t2` ( + `a` int(11) default NULL, + KEY `a` (`a`) +) ; + +insert into t2 select A.a + 10*(B.a + 10* C.a) from t1 A, t1 B, t1 C ; +insert into t1 select a from t2; + +drop table t2; +CREATE TABLE `t2` ( + `a` int(11) default NULL, + `b` int(11) default NULL +) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (200), +PARTITION p1 VALUES LESS THAN (400), +PARTITION p2 VALUES LESS THAN (600), +PARTITION p3 VALUES LESS THAN (800), +PARTITION p4 VALUES LESS THAN (1001)); + +insert into t2 select a,1 from t1 where a < 200; +insert into t2 select a,2 from t1 where a >= 200 and a < 400; +insert into t2 select a,3 from t1 where a >= 400 and a < 600; +insert into t2 select a,4 from t1 where a >= 600 and a < 800; +insert into t2 select a,5 from t1 where a >= 800 and a < 1001; + +explain select * from t2; +explain select * from t2 where a < 801 and a > 200; +explain select * from t2 where a < 801 and a > 800; +explain select * from t2 where a > 600; +explain select * from t2 where a > 600 and b = 1; +explain select * from t2 where a > 600 and b = 4; +explain select * from t2 where a > 600 and b = 5; +explain select * from t2 where b = 5; + +flush status; +update t2 set b = 100 where b = 6; +show status like 'Handler_read_rnd_next'; +flush status; +update t2 set a = 1002 where a = 1001; +show status like 'Handler_read_rnd_next'; +flush status; +update t2 set b = 6 where a = 600; +show status like 'Handler_read_rnd_next'; +flush status; +update t2 set b = 6 where a > 600 and a < 800; +show status like 'Handler_read_rnd_next'; +flush status; +delete from t2 where a > 600; +show status like 'Handler_read_rnd_next'; + +drop table t2; +CREATE TABLE `t2` ( + `a` int(11) default NULL, + `b` int(11) default NULL, + index (b) +) +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (200), +PARTITION p1 VALUES LESS THAN (400), +PARTITION p2 VALUES LESS THAN (600), +PARTITION p3 VALUES LESS THAN (800), +PARTITION p4 VALUES LESS THAN (1001)); + +insert into t2 select a,1 from t1 where a < 100; +insert into t2 select a,2 from t1 where a >= 200 and a < 300; +insert into t2 select a,3 from t1 where a >= 300 and a < 400; +insert into t2 select a,4 from t1 where a >= 400 and a < 500; +insert into t2 select a,5 from t1 where a >= 500 and a < 600; +insert into t2 select a,6 from t1 where a >= 600 and a < 700; +insert into t2 select a,7 from t1 where a >= 700 and a < 800; +insert into t2 select a,8 from t1 where a >= 800 and a < 900; +insert into t2 select a,9 from t1 where a >= 900 and a < 1001; + +explain select * from t2; +# not using indexes +explain select * from t2 where a = 101; +explain select * from t2 where a = 550; +explain select * from t2 where a = 833; +explain select * from t2 where (a = 100 OR a = 900); +explain select * from t2 where (a > 100 AND a < 600); +explain select * from t2 where b = 4; + +explain select * from t2 where b = 6; + +explain select * from t2 where b in (1,3,5); + +explain select * from t2 where b in (2,4,6); + +explain select * from t2 where b in (7,8,9); + +explain select * from t2 where b > 5; + +explain select * from t2 where b > 5 and b < 8; + +explain select * from t2 where b > 5 and b < 7; + +explain select * from t2 where b > 0 and b < 5; + +flush status; +update t2 set a = 111 where b = 10; +show status like 'Handler_read_rnd_next'; +show status like 'Handler_read_key'; +flush status; +update t2 set a = 111 where b in (5,6); +show status like 'Handler_read_rnd_next'; +show status like 'Handler_read_key'; +flush status; +update t2 set a = 222 where b = 7; +show status like 'Handler_read_rnd_next'; +show status like 'Handler_read_key'; +flush status; +delete from t2 where b = 7; +show status like 'Handler_read_rnd_next'; +show status like 'Handler_read_key'; +flush status; +delete from t2 where b > 5; +show status like 'Handler_read_rnd_next'; +show status like 'Handler_read_key'; +show status like 'Handler_read_prev'; +show status like 'Handler_read_next'; +flush status; +delete from t2 where b < 5 or b > 3; +show status like 'Handler_read_rnd_next'; +show status like 'Handler_read_key'; +show status like 'Handler_read_prev'; +show status like 'Handler_read_next'; + +drop table t1, t2; + +# BUG#20484 "Partitions: crash with explain and union" +create table t1 (s1 int); +explain select 1 from t1 union all select 2; +drop table t1; + +# +# Test all variants of usage for interval_via_mapping +# and interval_via_walking +# +# t1 will use interval_via_mapping since it uses a +# monotonic function, whereas t2 will use +# interval_via_walking since the intervals are short +# and the function isn't monotonic (it is, but it isn't +# discovered in this version). +# + create table t1 (a int) + partition by range(a) ( + partition p0 values less than (64), + partition p1 values less than (128), + partition p2 values less than (255) +); + +create table t2 (a int) + partition by range(a+0) ( + partition p0 values less than (64), + partition p1 values less than (128), + partition p2 values less than (255) +); + +insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); +insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); +explain select * from t1 where a=0; +explain select * from t2 where a=0; +explain select * from t1 where a=0xFE; +explain select * from t2 where a=0xFE; +explain select * from t1 where a > 0xFE AND a <= 0xFF; +explain select * from t2 where a > 0xFE AND a <= 0xFF; +explain select * from t1 where a >= 0xFE AND a <= 0xFF; +explain select * from t2 where a >= 0xFE AND a <= 0xFF; +explain select * from t1 where a < 64 AND a >= 63; +explain select * from t2 where a < 64 AND a >= 63; +explain select * from t1 where a <= 64 AND a >= 63; +explain select * from t2 where a <= 64 AND a >= 63; +drop table t1; +drop table t2; + +create table t1(a bigint unsigned not null) partition by range(a+0) ( + partition p1 values less than (10), + partition p2 values less than (20), + partition p3 values less than (2305561538531885056), + partition p4 values less than (2305561538531950591) +); + +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); +insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); + +explain select * from t1 where + a >= 2305561538531885056-10 and a <= 2305561538531885056-8; + +explain select * from t1 where + a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; + +explain select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; +drop table t1; + +create table t1 (a bigint) partition by range(a+0) ( + partition p1 values less than (-1000), + partition p2 values less than (-10), + partition p3 values less than (10), + partition p4 values less than (1000) +); +insert into t1 values (-15),(-5),(5),(15),(-15),(-5),(5),(15); +explain select * from t1 where a>-2 and a <=0; +drop table t1; + + +# +# BUG#27927 Partition pruning not optimal with TO_DAYS function +# + +CREATE TABLE t1 ( recdate DATETIME NOT NULL ) +PARTITION BY RANGE( TO_DAYS(recdate) ) ( + PARTITION p0 VALUES LESS THAN ( TO_DAYS('2007-03-08') ), + PARTITION p1 VALUES LESS THAN ( TO_DAYS('2007-04-01') ) +); +INSERT INTO t1 VALUES ('2007-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2007-03-07 12:00:00'); +INSERT INTO t1 VALUES ('2007-03-08 12:00:00'); +INSERT INTO t1 VALUES ('2007-03-15 12:00:00'); +-- echo must use p0 only: +explain select * from t1 where recdate < '2007-03-08 00:00:00'; + +drop table t1; +CREATE TABLE t1 ( recdate DATETIME NOT NULL ) +PARTITION BY RANGE( YEAR(recdate) ) ( + PARTITION p0 VALUES LESS THAN (2006), + PARTITION p1 VALUES LESS THAN (2007) +); +INSERT INTO t1 VALUES ('2005-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2005-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); +INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); + +-- echo must use p0 only: +explain select * from t1 where recdate < '2006-01-01 00:00:00'; +drop table t1; + +-- echo # +-- echo # BUG#33730 Full table scan instead selected partitions for query more than 10 partitions +-- echo # +create table t0 (a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int) + partition by range(a+0) ( + partition p0 values less than (64), + partition p1 values less than (128), + partition p2 values less than (255) +); +insert into t1 select A.a + 10*B.a from t0 A, t0 B; + +# this will use interval_via_walking +explain select * from t1 where a between 10 and 13; +explain select * from t1 where a between 10 and 10+33; + +drop table t0, t1; \ No newline at end of file diff --git a/cmd/importer/db.go b/cmd/importer/db.go index 5f5d174bc3f45..92bf182828ed0 100644 --- a/cmd/importer/db.go +++ b/cmd/importer/db.go @@ -21,7 +21,7 @@ import ( "strings" _ "github.com/go-sql-driver/mysql" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) diff --git a/cmd/importer/parser.go b/cmd/importer/parser.go index 13926e1928f58..b953403698d88 100644 --- a/cmd/importer/parser.go +++ b/cmd/importer/parser.go @@ -18,10 +18,10 @@ import ( "strconv" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser" _ "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" @@ -117,7 +117,7 @@ func (col *column) parseColumnOptions(ops []*ast.ColumnOption) { case ast.ColumnOptionPrimaryKey, ast.ColumnOptionUniqKey, ast.ColumnOptionAutoIncrement: col.table.uniqIndices[col.name] = col case ast.ColumnOptionComment: - col.comment = op.Expr.GetDatum().GetString() + col.comment = op.Expr.(ast.ValueExpr).GetDatumString() } } } diff --git a/cmd/importer/stats.go b/cmd/importer/stats.go index e9917cd1872c6..5ef2a543805e3 100644 --- a/cmd/importer/stats.go +++ b/cmd/importer/stats.go @@ -19,7 +19,7 @@ import ( "math/rand" "time" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/model" stats "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" diff --git a/config/config.go b/config/config.go index 9e9ce88c2e17e..258c9a5fcaa64 100644 --- a/config/config.go +++ b/config/config.go @@ -47,6 +47,7 @@ type Config struct { Host string `toml:"host" json:"host"` AdvertiseAddress string `toml:"advertise-address" json:"advertise-address"` Port uint `toml:"port" json:"port"` + Cors string `toml:"cors" json:"cors"` Store string `toml:"store" json:"store"` Path string `toml:"path" json:"path"` Socket string `toml:"socket" json:"socket"` @@ -252,6 +253,7 @@ var defaultConf = Config{ Host: "0.0.0.0", AdvertiseAddress: "", Port: 4000, + Cors: "", Store: "mocktikv", Path: "/tmp/tidb", RunDDL: true, diff --git a/ddl/callback.go b/ddl/callback.go index 0b290df42aead..340f0d2726165 100644 --- a/ddl/callback.go +++ b/ddl/callback.go @@ -14,8 +14,8 @@ package ddl import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "golang.org/x/net/context" ) diff --git a/ddl/callback_test.go b/ddl/callback_test.go index 57b23d96c9e5e..4b60b4d4f9afd 100644 --- a/ddl/callback_test.go +++ b/ddl/callback_test.go @@ -15,8 +15,8 @@ package ddl import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" log "github.com/sirupsen/logrus" "golang.org/x/net/context" diff --git a/ddl/column.go b/ddl/column.go index ace6ad60c2a83..e28ff4b18bc12 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -14,11 +14,16 @@ package ddl import ( - "github.com/pingcap/tidb/ast" + "fmt" + + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) @@ -267,27 +272,42 @@ func onSetDefaultValue(t *meta.Meta, job *model.Job) (ver int64, _ error) { return updateColumn(t, job, newCol, &newCol.Name) } -func onModifyColumn(t *meta.Meta, job *model.Job) (ver int64, _ error) { +func (w *worker) onModifyColumn(t *meta.Meta, job *model.Job) (ver int64, _ error) { newCol := &model.ColumnInfo{} oldColName := &model.CIStr{} pos := &ast.ColumnPosition{} - err := job.DecodeArgs(newCol, oldColName, pos) + var modifyColumnTp byte + err := job.DecodeArgs(newCol, oldColName, pos, &modifyColumnTp) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } - return doModifyColumn(t, job, newCol, oldColName, pos) + return w.doModifyColumn(t, job, newCol, oldColName, pos, modifyColumnTp) } // doModifyColumn updates the column information and reorders all columns. -func doModifyColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldName *model.CIStr, pos *ast.ColumnPosition) (ver int64, _ error) { +func (w *worker) doModifyColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldName *model.CIStr, pos *ast.ColumnPosition, modifyColumnTp byte) (ver int64, _ error) { + dbInfo, err := t.GetDatabase(job.SchemaID) + if err != nil { + return ver, errors.Trace(err) + } + tblInfo, err := getTableInfo(t, job, job.SchemaID) if err != nil { return ver, errors.Trace(err) } oldCol := model.FindColumnInfo(tblInfo.Columns, oldName.L) + if job.IsRollingback() { + ver, err = rollbackModifyColumnJob(t, tblInfo, job, oldCol, modifyColumnTp) + if err != nil { + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateRollbackDone, model.StateNone, ver, tblInfo) + return ver, nil + } + if oldCol == nil || oldCol.State != model.StatePublic { job.State = model.JobStateCancelled return ver, infoschema.ErrColumnNotExists.GenWithStackByArgs(oldName, tblInfo.Name) @@ -308,6 +328,17 @@ func doModifyColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldN // } // } + if !mysql.HasNotNullFlag(oldCol.Flag) && mysql.HasNotNullFlag(newCol.Flag) { + ver, err = modifyColumnFromNull2NotNull(w, t, dbInfo, tblInfo, job, oldCol, newCol) + if err != nil { + return ver, errors.Trace(err) + } + // Introduce the `mysql.HasPreventNullInsertFlag` flag to prevent users from inserting or updating null values. + if !mysql.HasPreventNullInsertFlag(oldCol.Flag) { + return ver, nil + } + } + // We need the latest column's offset and state. This information can be obtained from the store. newCol.Offset = oldCol.Offset newCol.State = oldCol.State @@ -316,13 +347,14 @@ func doModifyColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldN if pos.Tp == ast.ColumnPositionAfter { if oldName.L == pos.RelativeColumn.Name.L { // `alter table tableName modify column b int after b` will return ver,ErrColumnNotExists. - job.State = model.JobStateCancelled + // Modified the type definition of 'null' to 'not null' before this, so rollback the job when an error occurs. + job.State = model.JobStateRollingback return ver, infoschema.ErrColumnNotExists.GenWithStackByArgs(oldName, tblInfo.Name) } relative := model.FindColumnInfo(tblInfo.Columns, pos.RelativeColumn.Name.L) if relative == nil || relative.State != model.StatePublic { - job.State = model.JobStateCancelled + job.State = model.JobStateRollingback return ver, infoschema.ErrColumnNotExists.GenWithStackByArgs(pos.RelativeColumn, tblInfo.Name) } @@ -371,7 +403,8 @@ func doModifyColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldN ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) if err != nil { - job.State = model.JobStateCancelled + // Modified the type definition of 'null' to 'not null' before this, so rollBack the job when an error occurs. + job.State = model.JobStateRollingback return ver, errors.Trace(err) } @@ -379,6 +412,24 @@ func doModifyColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldN return ver, nil } +// checkForNullValue ensure there are no null values of the column of this table. +// `isDataTruncated` indicates whether the new field and the old field type are the same, in order to be compatible with mysql. +func checkForNullValue(ctx sessionctx.Context, isDataTruncated bool, schema, table, oldCol, newCol model.CIStr) error { + sql := fmt.Sprintf("select count(*) from `%s`.`%s` where `%s` is null limit 1;", schema.L, table.L, oldCol.L) + rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) + if err != nil { + return errors.Trace(err) + } + rowCount := rows[0].GetInt64(0) + if rowCount != 0 { + if isDataTruncated { + return errInvalidUseOfNull + } + return ErrWarnDataTruncated.GenWithStackByArgs(newCol.L, rowCount) + } + return nil +} + func updateColumn(t *meta.Meta, job *model.Job, newCol *model.ColumnInfo, oldColName *model.CIStr) (ver int64, _ error) { tblInfo, err := getTableInfo(t, job, job.SchemaID) if err != nil { @@ -423,3 +474,42 @@ func checkAddColumnTooManyColumns(oldCols int) error { } return nil } + +// rollbackModifyColumnJob rollbacks the job when an error occurs. +func rollbackModifyColumnJob(t *meta.Meta, tblInfo *model.TableInfo, job *model.Job, oldCol *model.ColumnInfo, modifyColumnTp byte) (ver int64, _ error) { + var err error + if modifyColumnTp == mysql.TypeNull { + // field NotNullFlag flag reset. + tblInfo.Columns[oldCol.Offset].Flag = oldCol.Flag &^ mysql.NotNullFlag + // field PreventNullInsertFlag flag reset. + tblInfo.Columns[oldCol.Offset].Flag = oldCol.Flag &^ mysql.PreventNullInsertFlag + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + } + return ver, nil +} + +// modifyColumnFromNull2NotNull modifies the type definitions of 'null' to 'not null'. +func modifyColumnFromNull2NotNull(w *worker, t *meta.Meta, dbInfo *model.DBInfo, tblInfo *model.TableInfo, job *model.Job, oldCol, newCol *model.ColumnInfo) (ver int64, _ error) { + // Get sessionctx from context resource pool. + var ctx sessionctx.Context + ctx, err := w.sessPool.get() + if err != nil { + return ver, errors.Trace(err) + } + defer w.sessPool.put(ctx) + + // If there is a null value inserted, it cannot be modified and needs to be rollback. + err = checkForNullValue(ctx, oldCol.Tp == newCol.Tp, dbInfo.Name, tblInfo.Name, oldCol.Name, newCol.Name) + if err != nil { + job.State = model.JobStateRollingback + return ver, errors.Trace(err) + } + + // Prevent this field from inserting null values. + tblInfo.Columns[oldCol.Offset].Flag |= mysql.PreventNullInsertFlag + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + return ver, errors.Trace(err) +} diff --git a/ddl/column_change_test.go b/ddl/column_change_test.go index 9ea837ae0a5b1..6655067a3f9c8 100644 --- a/ddl/column_change_test.go +++ b/ddl/column_change_test.go @@ -19,11 +19,11 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" diff --git a/ddl/column_test.go b/ddl/column_test.go index 4eea2c9b862d0..1859f1a696d73 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -18,16 +18,16 @@ import ( "sync" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" "github.com/pkg/errors" diff --git a/ddl/db_change_test.go b/ddl/db_change_test.go index 79837b9765ce9..ce9d7d3c053a2 100644 --- a/ddl/db_change_test.go +++ b/ddl/db_change_test.go @@ -21,19 +21,20 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/admin" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" "github.com/pkg/errors" @@ -229,7 +230,7 @@ func (s *testStateChangeSuite) test(c *C, tableName, alterTableSQL string, testI type stateCase struct { session session.Session rawStmt ast.StmtNode - stmt ast.Statement + stmt sqlexec.Statement expectedExecErr error expectedCompileErr error } @@ -601,6 +602,18 @@ func (s *testStateChangeSuite) TestParallelAlterModifyColumn(c *C) { s.testControlParallelExecSQL(c, sql, sql, f) } +func (s *testStateChangeSuite) TestParallelColumnModifyingDefinition(c *C) { + sql1 := "insert into t(b) values (null);" + sql2 := "alter table t change b b2 bigint not null;" + f := func(c *C, err1, err2 error) { + c.Assert(err1, IsNil) + if err2 != nil { + c.Assert(err2.Error(), Equals, "[ddl:1265]Data truncated for column 'b2' at row 1") + } + } + s.testControlParallelExecSQL(c, sql1, sql2, f) +} + func (s *testStateChangeSuite) TestParallelChangeColumnName(c *C) { sql1 := "ALTER TABLE t CHANGE a aa int;" sql2 := "ALTER TABLE t CHANGE b aa int;" diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index 77f03ba8ad119..2698a82b5256c 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -17,6 +17,7 @@ import ( "fmt" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" @@ -25,7 +26,6 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" diff --git a/ddl/db_test.go b/ddl/db_test.go index e7a4f3a687fa7..274eca7290eba 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -24,16 +24,17 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + tmysql "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - tmysql "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" @@ -41,7 +42,6 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/mock" @@ -1226,8 +1226,12 @@ func (s *testDBSuite) TestChangeColumn(c *C) { s.testErrorCode(c, sql, tmysql.ErrWrongDBName) sql = "alter table t3 change t.a aa bigint" s.testErrorCode(c, sql, tmysql.ErrWrongTableName) - sql = "alter table t3 change aa a bigint not null" - s.testErrorCode(c, sql, tmysql.ErrUnknown) + s.mustExec(c, "create table t4 (c1 int, c2 int, c3 int default 1, index (c1));") + s.tk.MustExec("insert into t4(c2) values (null);") + sql = "alter table t4 change c1 a1 int not null;" + s.testErrorCode(c, sql, tmysql.ErrInvalidUseOfNull) + sql = "alter table t4 change c2 a bigint not null;" + s.testErrorCode(c, sql, tmysql.WarnDataTruncated) sql = "alter table t3 modify en enum('a', 'z', 'b', 'c') not null default 'a'" s.testErrorCode(c, sql, tmysql.ErrUnknown) // Rename to an existing column. @@ -1527,6 +1531,15 @@ func (s *testDBSuite) TestCreateTable(c *C) { c.Assert(err, NotNil) } +func (s *testDBSuite) TestTableForeignKey(c *C) { + s.tk = testkit.NewTestKit(c, s.store) + s.tk.MustExec("use test") + s.tk.MustExec("create table t1 (a int, b int);") + failSQL := "create table t2 (c int, foreign key (a) references t1(a));" + s.testErrorCode(c, failSQL, tmysql.ErrKeyColumnDoesNotExits) + s.tk.MustExec("drop table if exists t1,t2;") +} + func (s *testDBSuite) TestBitDefaultValue(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -3008,6 +3021,33 @@ func (s *testDBSuite) TestTruncatePartitionAndDropTable(c *C) { hasOldPartitionData = checkPartitionDelRangeDone(c, s, partitionPrefix) c.Assert(hasOldPartitionData, IsFalse) s.testErrorCode(c, "select * from t4;", tmysql.ErrNoSuchTable) + + // Test truncate table partition reassign a new partitionIDs. + s.tk.MustExec("drop table if exists t5;") + s.tk.MustExec("set @@session.tidb_enable_table_partition=1;") + s.tk.MustExec(`create table t5( + id int, name varchar(50), + purchased date + ) + partition by range( year(purchased) ) ( + partition p0 values less than (1990), + partition p1 values less than (1995), + partition p2 values less than (2000), + partition p3 values less than (2005), + partition p4 values less than (2010), + partition p5 values less than (2015) + );`) + is = domain.GetDomain(ctx).InfoSchema() + oldTblInfo, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t5")) + c.Assert(err, IsNil) + oldPID = oldTblInfo.Meta().Partition.Definitions[0].ID + + s.tk.MustExec("truncate table t5;") + is = domain.GetDomain(ctx).InfoSchema() + c.Assert(err, IsNil) + newTblInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t5")) + newPID := newTblInfo.Meta().Partition.Definitions[0].ID + c.Assert(oldPID != newPID, IsTrue) } func (s *testDBSuite) TestPartitionUniqueKeyNeedAllFieldsInPf(c *C) { @@ -3416,6 +3456,112 @@ func backgroundExecOnJobUpdatedExported(c *C, s *testDBSuite, hook *ddl.TestDDLC return hook.OnJobUpdatedExported, c3IdxInfo } +func (s *testDBSuite) TestColumnModifyingDefinition(c *C) { + s.tk = testkit.NewTestKit(c, s.store) + s.tk.MustExec("use test") + s.tk.MustExec("drop table if exists test2;") + s.tk.MustExec("create table test2 (c1 int, c2 int, c3 int default 1, index (c1));") + s.tk.MustExec("alter table test2 change c2 a int not null;") + ctx := s.tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + t, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("test2")) + c.Assert(err, IsNil) + var c2 *table.Column + for _, col := range t.Cols() { + if col.Name.L == "a" { + c2 = col + } + } + c.Assert(mysql.HasNotNullFlag(c2.Flag), IsTrue) + + s.tk.MustExec("drop table if exists test2;") + s.tk.MustExec("create table test2 (c1 int, c2 int, c3 int default 1, index (c1));") + s.tk.MustExec("insert into test2(c2) values (null);") + s.testErrorCode(c, "alter table test2 change c2 a int not null", tmysql.ErrInvalidUseOfNull) + s.testErrorCode(c, "alter table test2 change c1 a1 bigint not null;", tmysql.WarnDataTruncated) +} + +func (s *testDBSuite) TestModifyColumnRollBack(c *C) { + s.tk = testkit.NewTestKit(c, s.store) + s.mustExec(c, "use test_db") + s.mustExec(c, "drop table if exists t1") + s.mustExec(c, "create table t1 (c1 int, c2 int, c3 int default 1, index (c1));") + + var c2 *table.Column + var checkErr error + oldReorgWaitTimeout := ddl.ReorgWaitTimeout + ddl.ReorgWaitTimeout = 10 * time.Millisecond + hook := &ddl.TestDDLCallback{} + hook.OnJobUpdatedExported = func(job *model.Job) { + if checkErr != nil { + return + } + + t := s.testGetTable(c, "t1") + for _, col := range t.Cols() { + if col.Name.L == "c2" { + c2 = col + } + } + if mysql.HasPreventNullInsertFlag(c2.Flag) { + s.testErrorCode(c, "insert into t1(c2) values (null);", tmysql.ErrBadNull) + } + + hookCtx := mock.NewContext() + hookCtx.Store = s.store + var err error + err = hookCtx.NewTxn() + if err != nil { + checkErr = errors.Trace(err) + return + } + + jobIDs := []int64{job.ID} + errs, err := admin.CancelJobs(hookCtx.Txn(), jobIDs) + if err != nil { + checkErr = errors.Trace(err) + return + } + // It only tests cancel one DDL job. + if errs[0] != nil { + checkErr = errors.Trace(errs[0]) + return + } + + err = hookCtx.Txn().Commit(context.Background()) + if err != nil { + checkErr = errors.Trace(err) + } + } + + s.dom.DDL().(ddl.DDLForTest).SetHook(hook) + done := make(chan error, 1) + go backgroundExec(s.store, "alter table t1 change c2 c2 bigint not null;", done) + ticker := time.NewTicker(s.lease / 2) + defer ticker.Stop() +LOOP: + for { + select { + case err := <-done: + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:12]cancelled DDL job") + break LOOP + case <-ticker.C: + s.mustExec(c, "insert into t1(c2) values (null);") + } + } + + t := s.testGetTable(c, "t1") + for _, col := range t.Cols() { + if col.Name.L == "c2" { + c2 = col + } + } + c.Assert(mysql.HasNotNullFlag(c2.Flag), IsFalse) + s.mustExec(c, "drop table t1") + ddl.ReorgWaitTimeout = oldReorgWaitTimeout +} + func (s *testDBSuite) TestPartitionAddIndex(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") diff --git a/ddl/ddl.go b/ddl/ddl.go index ce00d89adc829..fb88f2e457408 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -24,20 +24,20 @@ import ( "github.com/coreos/etcd/clientv3" "github.com/ngaut/pools" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" tidbutil "github.com/pingcap/tidb/util" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -96,7 +96,7 @@ var ( errIncorrectPrefixKey = terror.ClassDDL.New(codeIncorrectPrefixKey, "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") errTooLongKey = terror.ClassDDL.New(codeTooLongKey, fmt.Sprintf("Specified key was too long; max key length is %d bytes", maxPrefixLength)) - errKeyColumnDoesNotExits = terror.ClassDDL.New(codeKeyColumnDoesNotExits, "this key column doesn't exist in table") + errKeyColumnDoesNotExits = terror.ClassDDL.New(codeKeyColumnDoesNotExits, mysql.MySQLErrName[mysql.ErrKeyColumnDoesNotExits]) errUnknownTypeLength = terror.ClassDDL.New(codeUnknownTypeLength, "Unknown length for type tp %d") errUnknownFractionLength = terror.ClassDDL.New(codeUnknownFractionLength, "Unknown Length for type tp %d and fraction %d") errInvalidJobVersion = terror.ClassDDL.New(codeInvalidJobVersion, "DDL job with version %d greater than current %d") @@ -190,6 +190,8 @@ var ( // ErrUniqueKeyNeedAllFieldsInPf returns must include all columns in the table's partitioning function. ErrUniqueKeyNeedAllFieldsInPf = terror.ClassDDL.New(codeUniqueKeyNeedAllFieldsInPf, mysql.MySQLErrName[mysql.ErrUniqueKeyNeedAllFieldsInPf]) errWrongExprInPartitionFunc = terror.ClassDDL.New(codeWrongExprInPartitionFunc, mysql.MySQLErrName[mysql.ErrWrongExprInPartitionFunc]) + // ErrWarnDataTruncated returns data truncated error. + ErrWarnDataTruncated = terror.ClassDDL.New(codeWarnDataTruncated, mysql.MySQLErrName[mysql.WarnDataTruncated]) ) // DDL is responsible for updating schema in data store and maintaining in-memory InfoSchema cache. @@ -261,7 +263,7 @@ func (dc *ddlCtx) isOwner() bool { isOwner := dc.ownerManager.IsOwner() log.Debugf("[ddl] it's the DDL owner %v, self ID %s", isOwner, dc.uuid) if isOwner { - metrics.DDLCounter.WithLabelValues(metrics.IsDDLOwner).Inc() + metrics.DDLCounter.WithLabelValues(metrics.DDLOwner + "_" + mysql.TiDBReleaseVersion).Inc() } return isOwner } @@ -476,11 +478,6 @@ func (d *ddl) asyncNotifyWorker(jobTp model.ActionType) { } func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { - // For every DDL, we must commit current transaction. - if err := ctx.NewTxn(); err != nil { - return errors.Trace(err) - } - // Get a global job ID and put the DDL job in the queue. err := d.addDDLJob(ctx, job) if err != nil { @@ -583,7 +580,7 @@ const ( codeTooLongIdent = 1059 codeDupKeyName = 1061 codeTooLongKey = 1071 - codeKeyColumnDoesNotExits = 1072 + codeKeyColumnDoesNotExits = mysql.ErrKeyColumnDoesNotExits codeIncorrectPrefixKey = 1089 codeCantRemoveAllFields = 1090 codeCantDropFieldOrKey = 1091 @@ -620,6 +617,7 @@ const ( codeUniqueKeyNeedAllFieldsInPf = terror.ErrCode(mysql.ErrUniqueKeyNeedAllFieldsInPf) codePrimaryCantHaveNull = terror.ErrCode(mysql.ErrPrimaryCantHaveNull) codeWrongExprInPartitionFunc = terror.ErrCode(mysql.ErrWrongExprInPartitionFunc) + codeWarnDataTruncated = terror.ErrCode(mysql.WarnDataTruncated) ) func init() { @@ -667,6 +665,7 @@ func init() { codeUniqueKeyNeedAllFieldsInPf: mysql.ErrUniqueKeyNeedAllFieldsInPf, codePrimaryCantHaveNull: mysql.ErrPrimaryCantHaveNull, codeWrongExprInPartitionFunc: mysql.ErrWrongExprInPartitionFunc, + codeWarnDataTruncated: mysql.WarnDataTruncated, } terror.ErrClassToMySQLCodes[terror.ClassDDL] = ddlMySQLErrCodes } diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 70109e9214981..4b022a47076f3 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -24,17 +24,17 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pkg/errors" ) @@ -727,6 +727,9 @@ func buildTableInfo(ctx sessionctx.Context, d *ddl, tableName model.CIStr, cols fk.RefTable = constr.Refer.Table.Name fk.State = model.StatePublic for _, key := range constr.Keys { + if table.FindCol(cols, key.Column.Name.O) == nil { + return nil, errKeyColumnDoesNotExits.GenWithStackByArgs(key.Column.Name) + } fk.Cols = append(fk.Cols, key.Column.Name) } for _, key := range constr.Refer.IndexColNames { @@ -749,7 +752,7 @@ func buildTableInfo(ctx sessionctx.Context, d *ddl, tableName model.CIStr, cols for _, key := range constr.Keys { col = table.FindCol(cols, key.Column.Name.O) if col == nil { - return nil, errKeyColumnDoesNotExits.GenWithStack("key column %s doesn't exist in table", key.Column.Name) + return nil, errKeyColumnDoesNotExits.GenWithStackByArgs(key.Column.Name) } // Virtual columns cannot be used in primary key. if col.IsGenerated() && !col.GeneratedStored { @@ -1652,9 +1655,14 @@ func (d *ddl) getModifiableColumnJob(ctx sessionctx.Context, ident ast.Ident, or return nil, errUnsupportedModifyColumn.GenWithStackByArgs("set auto_increment") } - // We don't support modifying the type definitions from 'null' to 'not null' now. + // We support modifying the type definitions of 'null' to 'not null' now. + var modifyColumnTp byte if !mysql.HasNotNullFlag(col.Flag) && mysql.HasNotNullFlag(newCol.Flag) { - return nil, errUnsupportedModifyColumn.GenWithStackByArgs("null to not null") + if err = checkForNullValue(ctx, col.Tp == newCol.Tp, ident.Schema, ident.Name, col.Name, newCol.Name); err != nil { + return nil, errors.Trace(err) + } + // `modifyColumnTp` indicates that there is a type modification. + modifyColumnTp = mysql.TypeNull } // As same with MySQL, we don't support modifying the stored status for generated columns. if err = checkModifyGeneratedColumn(t.Cols(), col, newCol); err != nil { @@ -1666,7 +1674,7 @@ func (d *ddl) getModifiableColumnJob(ctx sessionctx.Context, ident ast.Ident, or TableID: t.Meta().ID, Type: model.ActionModifyColumn, BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{&newCol, originalColName, spec.Position}, + Args: []interface{}{&newCol, originalColName, spec.Position, modifyColumnTp}, } return job, nil } diff --git a/ddl/ddl_test.go b/ddl/ddl_test.go index a353102726404..d385df975f84d 100644 --- a/ddl/ddl_test.go +++ b/ddl/ddl_test.go @@ -20,14 +20,14 @@ import ( "github.com/coreos/etcd/clientv3" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" @@ -39,6 +39,8 @@ import ( type DDLForTest interface { // SetHook sets the hook. SetHook(h Callback) + // GetHook gets the hook. + GetHook() Callback // SetInterceptoror sets the interceptor. SetInterceptoror(h Interceptor) } @@ -51,6 +53,14 @@ func (d *ddl) SetHook(h Callback) { d.mu.hook = h } +// GetHook implements DDL.GetHook interface. +func (d *ddl) GetHook() Callback { + d.mu.Lock() + defer d.mu.Unlock() + + return d.mu.hook +} + // SetInterceptoror implements DDL.SetInterceptoror interface. func (d *ddl) SetInterceptoror(i Interceptor) { d.mu.Lock() diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 6afeea59937ff..fd6ed28300fc1 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -20,13 +20,13 @@ import ( "time" "github.com/ngaut/pools" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "golang.org/x/net/context" @@ -276,18 +276,20 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerFinishDDLJob, job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) }() - switch job.Type { - case model.ActionAddIndex: - if job.State != model.JobStateRollbackDone { - break + if !job.IsCancelled() { + switch job.Type { + case model.ActionAddIndex: + if job.State != model.JobStateRollbackDone { + break + } + // After rolling back an AddIndex operation, we need to use delete-range to delete the half-done index data. + err = w.deleteRange(job) + case model.ActionDropSchema, model.ActionDropTable, model.ActionTruncateTable, model.ActionDropIndex, model.ActionDropTablePartition: + err = w.deleteRange(job) + } + if err != nil { + return errors.Trace(err) } - // After rolling back an AddIndex operation, we need to use delete-range to delete the half-done index data. - err = w.deleteRange(job) - case model.ActionDropSchema, model.ActionDropTable, model.ActionTruncateTable, model.ActionDropIndex, model.ActionDropTablePartition: - err = w.deleteRange(job) - } - if err != nil { - return errors.Trace(err) } _, err = t.DeQueueDDLJob() @@ -380,6 +382,7 @@ func (w *worker) handleDDLJobQueue(d *ddlCtx) error { // and retry later if the job is not cancelled. schemaVer, runJobErr = w.runDDLJob(d, t, job) if job.IsCancelled() { + txn.Reset() err = w.finishDDLJob(t, job) return errors.Trace(err) } @@ -482,7 +485,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, case model.ActionDropColumn: ver, err = onDropColumn(t, job) case model.ActionModifyColumn: - ver, err = onModifyColumn(t, job) + ver, err = w.onModifyColumn(t, job) case model.ActionSetDefaultValue: ver, err = onSetDefaultValue(t, job) case model.ActionAddIndex: @@ -510,7 +513,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, default: // Invalid job, cancel it. job.State = model.JobStateCancelled - err = errInvalidDDLJob.GenWithStack("invalid ddl job %v", job) + err = errInvalidDDLJob.GenWithStack("invalid ddl job type: %v", job.Type) } // Save errors in job, so that others can know errors happened. @@ -519,7 +522,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, if job.State != model.JobStateCancelled { log.Errorf("[ddl-%s] run DDL job err %v", w, errors.ErrorStack(err)) } else { - log.Infof("[ddl-%s] the DDL job is normal to cancel because %v", w, errors.ErrorStack(err)) + log.Infof("[ddl-%s] the DDL job is normal to cancel because %v", w, err) } job.Error = toTError(err) diff --git a/ddl/ddl_worker_test.go b/ddl/ddl_worker_test.go index b6038bd5ce9ae..dbba30142bea0 100644 --- a/ddl/ddl_worker_test.go +++ b/ddl/ddl_worker_test.go @@ -18,11 +18,11 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/admin" @@ -136,6 +136,24 @@ func (s *testDDLSuite) TestTableError(c *C) { } +func (s *testDDLSuite) TestInvalidDDLJob(c *C) { + store := testCreateStore(c, "test_invalid_ddl_job_type_error") + defer store.Close() + d := testNewDDL(context.Background(), nil, store, nil, nil, testLease) + defer d.Stop() + ctx := testNewContext(d) + + job := &model.Job{ + SchemaID: 0, + TableID: 0, + Type: model.ActionNone, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + } + err := d.doDDLJob(ctx, job) + c.Assert(err.Error(), Equals, "[ddl:3]invalid ddl job type: none") +} + func (s *testDDLSuite) TestForeignKeyError(c *C) { store := testCreateStore(c, "test_foreign_key_error") defer store.Close() diff --git a/ddl/delete_range.go b/ddl/delete_range.go index aa1bf30640ad3..25a4512d6beeb 100644 --- a/ddl/delete_range.go +++ b/ddl/delete_range.go @@ -20,12 +20,12 @@ import ( "math" "sync" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/ddl/fail_db_test.go b/ddl/fail_db_test.go index 086f13af894eb..a55a64027ee6b 100644 --- a/ddl/fail_db_test.go +++ b/ddl/fail_db_test.go @@ -15,15 +15,131 @@ package ddl_test import ( "fmt" + "time" gofail "github.com/etcd-io/gofail/runtime" . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/model" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testleak" "golang.org/x/net/context" ) +var _ = Suite(&testFailDBSuite{}) + +type testFailDBSuite struct { + lease time.Duration + store kv.Storage + dom *domain.Domain + se session.Session + p *parser.Parser +} + +func (s *testFailDBSuite) SetUpSuite(c *C) { + testleak.BeforeTest() + s.lease = 200 * time.Millisecond + ddl.WaitTimeWhenErrorOccured = 1 * time.Microsecond + var err error + s.store, err = mockstore.NewMockTikvStore() + c.Assert(err, IsNil) + session.SetSchemaLease(s.lease) + s.dom, err = session.BootstrapSession(s.store) + c.Assert(err, IsNil) + s.se, err = session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + s.p = parser.New() +} + +func (s *testFailDBSuite) TearDownSuite(c *C) { + s.se.Execute(context.Background(), "drop database if exists test_db_state") + s.se.Close() + s.dom.Close() + s.store.Close() + testleak.AfterTest(c)() +} + +// TestHalfwayCancelOperations tests the case that the schema is correct after the execution of operations are cancelled halfway. +func (s *testFailDBSuite) TestHalfwayCancelOperations(c *C) { + gofail.Enable("github.com/pingcap/tidb/ddl/truncateTableErr", `return(true)`) + defer gofail.Disable("github.com/pingcap/tidb/ddl/truncateTableErr") + + // test for truncating table + _, err := s.se.Execute(context.Background(), "create database cancel_job_db") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "use cancel_job_db") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "create table t(a int)") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "insert into t values(1)") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "truncate table t") + c.Assert(err, NotNil) + // Make sure that the table's data has not been deleted. + rs, err := s.se.Execute(context.Background(), "select count(*) from t") + c.Assert(err, IsNil) + chk := rs[0].NewChunk() + err = rs[0].Next(context.Background(), chk) + c.Assert(err, IsNil) + c.Assert(chk.NumRows() == 0, IsFalse) + row := chk.GetRow(0) + c.Assert(row.Len(), Equals, 1) + c.Assert(row.GetInt64(0), DeepEquals, int64(1)) + c.Assert(rs[0].Close(), IsNil) + // Reload schema. + s.dom.ResetHandle(s.store) + err = s.dom.DDL().(ddl.DDLForTest).GetHook().OnChanged(nil) + c.Assert(err, IsNil) + s.se, err = session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "use cancel_job_db") + c.Assert(err, IsNil) + // Test schema is correct. + _, err = s.se.Execute(context.Background(), "select * from t") + c.Assert(err, IsNil) + + // test for renaming table + gofail.Enable("github.com/pingcap/tidb/ddl/errRenameTable", `return(true)`) + defer gofail.Disable("github.com/pingcap/tidb/ddl/errRenameTable") + _, err = s.se.Execute(context.Background(), "create table tx(a int)") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "insert into tx values(1)") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "rename table tx to ty") + c.Assert(err, NotNil) + // Make sure that the table's data has not been deleted. + rs, err = s.se.Execute(context.Background(), "select count(*) from tx") + c.Assert(err, IsNil) + chk = rs[0].NewChunk() + err = rs[0].Next(context.Background(), chk) + c.Assert(err, IsNil) + c.Assert(chk.NumRows() == 0, IsFalse) + row = chk.GetRow(0) + c.Assert(row.Len(), Equals, 1) + c.Assert(row.GetInt64(0), DeepEquals, int64(1)) + c.Assert(rs[0].Close(), IsNil) + // Reload schema. + s.dom.ResetHandle(s.store) + err = s.dom.DDL().(ddl.DDLForTest).GetHook().OnChanged(nil) + c.Assert(err, IsNil) + s.se, err = session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "use cancel_job_db") + c.Assert(err, IsNil) + // Test schema is correct. + _, err = s.se.Execute(context.Background(), "select * from tx") + c.Assert(err, IsNil) + + // clean up + _, err = s.se.Execute(context.Background(), "drop database cancel_job_db") + c.Assert(err, IsNil) +} + // TestInitializeOffsetAndState tests the case that the column's offset and state don't be initialized in the file of ddl_api.go when // doing the operation of 'modify column'. func (s *testStateChangeSuite) TestInitializeOffsetAndState(c *C) { diff --git a/ddl/fail_test.go b/ddl/fail_test.go index f89c4a9aae2ff..f182dbe388c5f 100644 --- a/ddl/fail_test.go +++ b/ddl/fail_test.go @@ -16,8 +16,8 @@ package ddl import ( gofail "github.com/etcd-io/gofail/runtime" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/types" "golang.org/x/net/context" ) diff --git a/ddl/foreign_key.go b/ddl/foreign_key.go index e9aa4c0eb43ad..d6c3de7d75c1e 100644 --- a/ddl/foreign_key.go +++ b/ddl/foreign_key.go @@ -14,9 +14,9 @@ package ddl import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pkg/errors" ) diff --git a/ddl/foreign_key_test.go b/ddl/foreign_key_test.go index 7fdde31834477..386b62e604e4e 100644 --- a/ddl/foreign_key_test.go +++ b/ddl/foreign_key_test.go @@ -18,9 +18,9 @@ import ( "sync" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util/testleak" @@ -78,7 +78,9 @@ func (s *testForeighKeySuite) testCreateForeignKey(c *C, tblInfo *model.TableInf BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{fkInfo}, } - err := s.d.doDDLJob(s.ctx, job) + err := s.ctx.NewTxn() + c.Assert(err, IsNil) + err = s.d.doDDLJob(s.ctx, job) c.Assert(err, IsNil) return job } diff --git a/ddl/generated_column.go b/ddl/generated_column.go index 899249a9fb658..3120b2d907258 100644 --- a/ddl/generated_column.go +++ b/ddl/generated_column.go @@ -14,7 +14,7 @@ package ddl import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/table" "github.com/pkg/errors" ) diff --git a/ddl/index.go b/ddl/index.go index 48455800f190d..2e92bf619c05e 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -19,14 +19,14 @@ import ( "sync/atomic" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv" diff --git a/ddl/index_change_test.go b/ddl/index_change_test.go index ec7d1ca73b3fa..518b0847471c7 100644 --- a/ddl/index_change_test.go +++ b/ddl/index_change_test.go @@ -15,10 +15,10 @@ package ddl import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" diff --git a/ddl/mock.go b/ddl/mock.go index 3ab786fd0138c..6060eb9bba5bb 100644 --- a/ddl/mock.go +++ b/ddl/mock.go @@ -18,8 +18,8 @@ import ( "time" "github.com/coreos/etcd/clientv3" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pkg/errors" "golang.org/x/net/context" diff --git a/ddl/partition.go b/ddl/partition.go index b1110209c3e3b..b2fdb760a4c44 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -19,12 +19,12 @@ import ( "strconv" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" @@ -417,3 +417,24 @@ func isRangePartitionColUnsignedBigint(cols []*table.Column, pi *model.Partition } return false } + +// truncateTableByReassignPartitionIDs reassign a new partition ids. +func truncateTableByReassignPartitionIDs(job *model.Job, t *meta.Meta, tblInfo *model.TableInfo) error { + newDefs := make([]model.PartitionDefinition, 0, len(tblInfo.Partition.Definitions)) + for _, def := range tblInfo.Partition.Definitions { + pid, err := t.GenGlobalID() + if err != nil { + job.State = model.JobStateCancelled + return errors.Trace(err) + } + newDef := model.PartitionDefinition{ + ID: pid, + Name: def.Name, + LessThan: def.LessThan, + Comment: def.Comment, + } + newDefs = append(newDefs, newDef) + } + tblInfo.Partition.Definitions = newDefs + return nil +} diff --git a/ddl/reorg.go b/ddl/reorg.go index 10cf2d85b9064..52b6009d927f2 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -18,15 +18,15 @@ import ( "sync/atomic" "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" diff --git a/ddl/reorg_test.go b/ddl/reorg_test.go index 84ba4b94bf60c..1bcfe9d21c402 100644 --- a/ddl/reorg_test.go +++ b/ddl/reorg_test.go @@ -17,9 +17,9 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/types" "golang.org/x/net/context" ) diff --git a/ddl/schema.go b/ddl/schema.go index 8e3272c033e1c..0c5cc0e82e21e 100644 --- a/ddl/schema.go +++ b/ddl/schema.go @@ -14,9 +14,9 @@ package ddl import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pkg/errors" ) diff --git a/ddl/schema_test.go b/ddl/schema_test.go index ffe058822e49b..e7fd0941eef77 100644 --- a/ddl/schema_test.go +++ b/ddl/schema_test.go @@ -17,12 +17,12 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/ddl/session_pool.go b/ddl/session_pool.go index 2fa4f39ce6966..7710355ce794b 100644 --- a/ddl/session_pool.go +++ b/ddl/session_pool.go @@ -17,7 +17,7 @@ import ( "sync" "github.com/ngaut/pools" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/mock" "github.com/pkg/errors" diff --git a/ddl/stat_test.go b/ddl/stat_test.go index ac19d7984daf9..304be372c5176 100644 --- a/ddl/stat_test.go +++ b/ddl/stat_test.go @@ -17,7 +17,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" "golang.org/x/net/context" diff --git a/ddl/table.go b/ddl/table.go index 930f871ff43d2..c6c95fc6707a8 100644 --- a/ddl/table.go +++ b/ddl/table.go @@ -18,12 +18,12 @@ import ( "strconv" "strings" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pkg/errors" @@ -208,19 +208,19 @@ func onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ erro job.State = model.JobStateCancelled return ver, errors.Trace(err) } + // gofail: var truncateTableErr bool + // if truncateTableErr { + // job.State = model.JobStateCancelled + // return ver, errors.New("occur an error after dropping table.") + // } - // We use the new partition ID because all the old data is encoded with the old partition ID, it can not be accessed anymore. var oldPartitionIDs []int64 if tblInfo.GetPartitionInfo() != nil { oldPartitionIDs = getPartitionIDs(tblInfo) - for _, def := range tblInfo.Partition.Definitions { - var pid int64 - pid, err = t.GenGlobalID() - if err != nil { - job.State = model.JobStateCancelled - return ver, errors.Trace(err) - } - def.ID = pid + // We use the new partition ID because all the old data is encoded with the old partition ID, it can not be accessed anymore. + err = truncateTableByReassignPartitionIDs(job, t, tblInfo) + if err != nil { + return ver, errors.Trace(err) } } @@ -338,6 +338,11 @@ func onRenameTable(t *meta.Meta, job *model.Job) (ver int64, _ error) { job.State = model.JobStateCancelled return ver, errors.Trace(err) } + // gofail: var renameTableErr bool + // if renameTableErr { + // job.State = model.JobStateCancelled + // return ver, errors.New("occur an error after renaming table.") + // } tblInfo.Name = tableName err = t.CreateTable(newSchemaID, tblInfo) if err != nil { diff --git a/ddl/table_split_test.go b/ddl/table_split_test.go index 01a4bcd6def75..697f18c16aa64 100644 --- a/ddl/table_split_test.go +++ b/ddl/table_split_test.go @@ -18,8 +18,8 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/tikv" diff --git a/ddl/table_test.go b/ddl/table_test.go index 7fef7c9bd50b5..ad39b3abd9f41 100644 --- a/ddl/table_test.go +++ b/ddl/table_test.go @@ -17,11 +17,11 @@ import ( "fmt" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" diff --git a/ddl/util/event.go b/ddl/util/event.go index d0575a76bccd8..a689c445c13c4 100644 --- a/ddl/util/event.go +++ b/ddl/util/event.go @@ -16,7 +16,7 @@ package util import ( "fmt" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/model" ) // Event is an event that a ddl operation happened. diff --git a/ddl/util/util.go b/ddl/util/util.go index f2b7c63a4ff14..c9a3c42a65633 100644 --- a/ddl/util/util.go +++ b/ddl/util/util.go @@ -17,9 +17,9 @@ import ( "encoding/hex" "fmt" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index b06dd9afa6c56..8d20dbd89f755 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -19,13 +19,13 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/execdetails" diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 5dddc206171d3..6dd12c6f20c22 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -16,8 +16,8 @@ package distsql import ( "math" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" diff --git a/distsql/select_result.go b/distsql/select_result.go index aca9ee0e9f561..9558f9e680ccc 100644 --- a/distsql/select_result.go +++ b/distsql/select_result.go @@ -16,11 +16,11 @@ package distsql import ( "time" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" diff --git a/distsql/stream.go b/distsql/stream.go index f5bd33583ccd6..0f651a53dc721 100644 --- a/distsql/stream.go +++ b/distsql/stream.go @@ -14,11 +14,11 @@ package distsql import ( + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" diff --git a/docs/design/2018-09-04-histograms-in-plan.md b/docs/design/2018-09-04-histograms-in-plan.md new file mode 100644 index 0000000000000..bba90f9af5124 --- /dev/null +++ b/docs/design/2018-09-04-histograms-in-plan.md @@ -0,0 +1,144 @@ +# Proposal: Maintain statistics in `Plan` + +- Author: [Yiding CUI](https://github.com/winoros) +- Last updated: 2018-09-04 + +## Abstract + +This proposal proposes to maintain the histogram in `Plan`’s statistics information. + + +## Background + +Currently, TiDB only uses statistics when deciding which physical scan method a table should use. And TiDB only stores simple statistics in the plan structure. But when deciding the join order and considering some other optimization rules, we need more detailed statistics. + +So we need to maintain the statistics in the plan structure to get sufficient statistics information to do optimizations. + +## Proposal + +The new `statsInfo` of `plan` should be something like the following structure: + +```go +type statsInfo struct { + // This two attributes are already used in current statsInfo. + count float64 + // The number of distinct value of each column. + ndv []float64 + + // HistColl collects histograms of columns. + histColl statistics.HistColl +} +``` + +This struct will be maintained when we call `deriveStats`. + +### How to maintain it. + +We maintain the histogram in `Projection`, `Selection`, `Join`, `Aggregation`, `Sort`, `Limit` and `DataSource` operators. + +#### `Selection` +Just use it to calculate the selectivity. + +And we can get the range information of each column and index involved in filters. Then we can use the range information to cut the histogram bucket of these columns. + +For column/index not matched in the filter. The `NDV` and `totalCnt` of each bucket can just multiply the total selectivity of filters(based on independent assumption). + +#### `Projection` +Change the reflection of the map we maintained. + +#### `Join` +There're several kinds of joins. + +##### Inner join +Use histograms to do the row count estimation with the join key condition. It can be described as the following procedures: + +- Align the histogram buckets so that each bucket boundary in one histogram can be matched in the other histogram. For example(the following figure), bucket `b1` and `c1`'s left boundary is the same. But the right boundary is different. So we can split `c1` into two buckets. The first one's boundary is totally the same with `b1`. The second one starts from where the first one ends. +- Since the boundary of the bucket have been aligned. Then we can estimate the join's size bucket by bucket by the well-know way. + +Original: + +original histogram + +Step 1: + +Step 1 + +Step 2: + +
+Step 2 +
+ +The calculation inside the bucket can be calculated as this formula $selectivity=joinKeySelectivity*RowCount(t1)*RowCount(t2)$ + +Where $joinKeySelectivity = \frac{1}{NDV(t1.key)}*\frac{1}{NDV(t2.key)}*ndvAfterJoin$. + +The `ndvAfterJoin` can be $min(NDV(t1.key), NDV(t2.key))$ or a more detailed one if we can calculate it. + + +Since it won’t have one side filter, we only need to consider the composite filters after considering the join key. We can simply multiply `selectionFactor` if there are other composite filters since `Selectivity` cannot calculate selectivity of an expression containing multiple columns. + +##### One side outer join +It's almost the same as inner join's behavior. But we need to consider two more thing: + +- The unmatched row will be filled as `NULL`. This should be calculated in the new histogram. The null count can be calculated when we estimate the matched count bucket by bucket. +- There will be one side filters of the outer table. If the filter is about join key and can be converted to range information, it's can be easily involved when we do the calculation bucket by bucket. Otherwise it's a little hard to deal with it. Don't consider this case currently. + +##### Semi join +It’s something similar to inner join. But no data expanding occurs. So the `total` can be adjusted easily. + +##### Anti semi join +Same with semi join. + +#### `Aggregate` +Just read the NDV information from the `statsInfo` to decide the row count after aggregate. If there's index can fully match the group-by items, we will just use its NDV. Otherwise we will multiply the ndv of each column(or index that can match part of the group-by item). + +If some of the group-by items are also in the select field, we will create new histograms by modifying the `totalCnt` of each bucket(set it the same with `NDV`). + +#### `Sort` +We can just copy children's `statsInfo` without doing any change, since the data distribution is not changed. + +#### `Limit` +Currently we won't maintain histogram information for it. But it can be considered in the future. + +#### `DataSource` +Our `DataSource` is actually `source of data` + `select`. So if it’s a non-partitioned table, we just maintain the map and do what `Select` does. If it’s a partitioned table, we now only store the statistics of each partition. So we need to merge them into one histogram so the upper plan can use it. We need a cache or something else to ensure that we won’t merge them each time we need it. + +#### Others +For other plan operators or `DataSource` which do not contain any histogram, we just use the original way to maintain `statsInfo`. We won’t maintain histograms for them. + +## Rationale + +### How other systems solve the same issue? + +I’ve looked into Spark. They only maintain the max and min values, won't create new histogram after `Select`/`Join`/`Aggregate`. And they don’t have the index, so maintaining the column’s max/min value is much easier to solve comparing with us. + +As for Orca and Calcite, I haven’t discovered where they maintain this information. But there’s something about statistics in Orca’s paper. According to the paper, I think they construct new histograms during planning and cache it to avoid building too many times. + +### What is the disadvantage of this design? + +This may have side effects on OLTP performance. (Currently totally changing a histogram whose number of bucket is 256 and content is int value costs 7000ns. So we can create 143 histograms at 1ms currently) + +For now, only join reorder and the position `after logical optimize before physical optimize` will trigger this mechanism and it’s controlled by `tidb_optimizer_selectivity_level` which is disabled by default. It will opened by default after we test it carefully. + +After we switch to the cascade-like planner, the rule that needs cost to make decision is still a small set of all. And the existence of `Group` can also help us. If we lazily construct the `statsInfo`, this may not be the bottleneck. + +And thanks to `predicate push down` and some other optimization rules. The single column(column directly from the DataSource not one the generated by `Project`'s complex `Expr`) filters(Only this type of expression can be calculated to range information) can be all pushed down to the `DataSource` or the `Selection` on the `DataSource`. So simple querys won't create many new histograms. + +### What is the impact of not doing this? + +Many cases reported by our customer already prove that we need more accurate statistics to choose a better join order and a proper join algorithm. Only maintaining a number about row count and a slice about NDV is not enough for making that decision. + +If we don’t do this, we cannot fix some cases except we use hints. + +## Compatibility + +There’s no compatibility issue. + +## Implementation + +First, maintain the histogram in `DataSource`. In this step, there will be some changes in the `statistics` package to make it work. It may take a little long time to do this. [PR#7385](https://github.com/pingcap/tidb/pull/7385) + +Then, all changes will be things inside `statsInfo`, which won’t affect other parts. It may not take too much time to implement this part. Like [PR#7595](https://github.com/pingcap/tidb/pull/7595) + +The future work will depend on the benchmark result of the join reorder algorithm. diff --git a/docs/design/2018-10-22-the-column-pool.md b/docs/design/2018-10-22-the-column-pool.md new file mode 100644 index 0000000000000..27cb5b73c66b9 --- /dev/null +++ b/docs/design/2018-10-22-the-column-pool.md @@ -0,0 +1,74 @@ +# Proposal: Support a Global Column Pool + +- Author(s): [zz-jason](https://github.com/zz-jason) +- Last updated: 2018-10-22 +- Discussion at: + +## Abstract + +This proposal is aimed to enable a fine-grained buffer reuse strategy. With the +help of the proposed column pool, we can: + +1. Reduce the total memory consumption during the execution phase. +2. Support column-oriented expression evaluation and leverage the power of + vectorized expression execution. + +## Background + +At present, the buffer reuse is in the granularity of Chunk. The disadvantages +of this **Chunk**-oriented reuse strategy are: + +1. This buffer reuse strategy isn't effective in some scenarios. Some memory + hold by the operators which are inactive can also be reused to reduce total + memory consumption when executing a query. + +2. In order to reuse a Chunk, we have to design the resource recycling strategy + for every operator which uses multiple goroutines to exploit the + thread-level parallelism. For example, hash join. It makes the code more + complicated and harder to be maintained. + +3. The memory used in the current query can not be reused in the next query + within the same session. Thus the golang GC pressure is increased and the + OLTP performance on a TiDB server is impacted. + +## Proposal + +The main idea of this proposal is to change the **Chunk**-oriented buffer reuse +strategy to **Column**-oriented and use a session-level column pool to achieve +that. + +### The column pool + +Considering that the current TiDB only supports a limited number of types, we +only need to consider 5 kinds of columns: + +- 4 fixed length columns: 4/8/16/40 +- 1 variable length column + +The column pool can be accessed by multiple goroutines concurrently, and to +reduce the lock conflict, we can split the pool into shards and randomize the +target shard in each Put/Get operation. Each shard of a column pool is +implemented as a last in first out stack, which helps to release the unused +column in the pool. And in most cases, the required length of a new column is +equal to the previous column put into the column pool. + +![the column pool](./the-column-pool.png) + +## Rationale + +No + +## Compatibility + +No + +## Implementation + +1. Implement the column pool firstly. +2. Remove the complicated, error-prone resource recycling strategy for each + operator. +3. Replace each **NewChunkWithCapacity**() with **pool.GetChunk**(). + +## Open issues (if applicable) + +No diff --git a/docs/design/README.md b/docs/design/README.md index 4318dbfeca3a3..5fa9d3870e0ef 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -12,6 +12,8 @@ A proposal template: [TEMPLATE.md](./TEMPLATE.md) - [Proposal: Enhance constraint propagation in TiDB logical plan](./2018-07-22-enhance-propagations.md) - [Proposal: A SQL Planner based on the Volcano/Cascades model](./2018-08-29-new-planner.md) - [Proposal: Implement Radix Hash Join](./2018-09-21-radix-hashjoin.md) +- [Proposal: Maintaining histograms in plan](./2018-09-04-histograms-in-plan.md) +- [Proposal: Support a Global Column Pool](./2018-10-22-the-column-pool.md) ## Completed diff --git a/docs/design/imgs/histogram-1.jpeg b/docs/design/imgs/histogram-1.jpeg new file mode 100644 index 0000000000000..e2c77455db1fc Binary files /dev/null and b/docs/design/imgs/histogram-1.jpeg differ diff --git a/docs/design/imgs/histogram-2.jpeg b/docs/design/imgs/histogram-2.jpeg new file mode 100644 index 0000000000000..6680da7f22d80 Binary files /dev/null and b/docs/design/imgs/histogram-2.jpeg differ diff --git a/docs/design/imgs/histogram-3.png b/docs/design/imgs/histogram-3.png new file mode 100644 index 0000000000000..1b9b58ac5fa4e Binary files /dev/null and b/docs/design/imgs/histogram-3.png differ diff --git a/docs/design/imgs/histogram-formula-1.png b/docs/design/imgs/histogram-formula-1.png new file mode 100644 index 0000000000000..db75c2c86f03e Binary files /dev/null and b/docs/design/imgs/histogram-formula-1.png differ diff --git a/docs/design/imgs/histogram-formula-2.png b/docs/design/imgs/histogram-formula-2.png new file mode 100644 index 0000000000000..b5a521fddcf3b Binary files /dev/null and b/docs/design/imgs/histogram-formula-2.png differ diff --git a/docs/design/imgs/histogram-formula-3.png b/docs/design/imgs/histogram-formula-3.png new file mode 100644 index 0000000000000..113f2aee96a1c Binary files /dev/null and b/docs/design/imgs/histogram-formula-3.png differ diff --git a/docs/design/the-column-pool.png b/docs/design/the-column-pool.png new file mode 100644 index 0000000000000..47eaf2b8964ea Binary files /dev/null and b/docs/design/the-column-pool.png differ diff --git a/domain/domain.go b/domain/domain.go index 8061751fc852b..c59012a0b69e5 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -25,20 +25,20 @@ import ( "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/ngaut/pools" "github.com/ngaut/sync2" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -533,6 +533,11 @@ func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duratio } } +// ResetHandle resets the domain's infoschema handle. It is used for testing. +func (do *Domain) ResetHandle(store kv.Storage) { + do.infoHandle = infoschema.NewHandle(store) +} + // Init initializes a domain. func (do *Domain) Init(ddlLease time.Duration, sysFactory func(*Domain) (pools.Resource, error)) error { if ebd, ok := do.store.(EtcdBackend); ok { diff --git a/domain/domain_test.go b/domain/domain_test.go index 63f90deda925e..c516632a99487 100644 --- a/domain/domain_test.go +++ b/domain/domain_test.go @@ -19,8 +19,8 @@ import ( "github.com/ngaut/pools" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/domain/global_vars_cache.go b/domain/global_vars_cache.go index a246f5af20f6c..1b316b4195ad7 100644 --- a/domain/global_vars_cache.go +++ b/domain/global_vars_cache.go @@ -17,7 +17,7 @@ import ( "sync" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/util/chunk" ) diff --git a/domain/info.go b/domain/info.go index 7d11e63436957..226b395eed0c4 100644 --- a/domain/info.go +++ b/domain/info.go @@ -20,9 +20,9 @@ import ( "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/clientv3/concurrency" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/printer" diff --git a/domain/schema_checker_test.go b/domain/schema_checker_test.go index b148525d200a2..bad9db98d0dc8 100644 --- a/domain/schema_checker_test.go +++ b/domain/schema_checker_test.go @@ -17,7 +17,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" ) func (s *testSuite) TestSchemaCheckerSimple(c *C) { diff --git a/domain/topn_slow_query.go b/domain/topn_slow_query.go index f8ae69c0be67e..0bf6721454d6c 100644 --- a/domain/topn_slow_query.go +++ b/domain/topn_slow_query.go @@ -19,7 +19,7 @@ import ( "sync" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/util/execdetails" ) diff --git a/executor/adapter.go b/executor/adapter.go index cf9c9702b12a6..44f6d5eaed6b7 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -20,22 +20,23 @@ import ( "sync/atomic" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/planner" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "golang.org/x/net/context" @@ -45,7 +46,7 @@ type processinfoSetter interface { SetProcessInfo(string, time.Time, byte) } -// recordSet wraps an executor, implements ast.RecordSet interface +// recordSet wraps an executor, implements sqlexec.RecordSet interface type recordSet struct { fields []*ast.ResultField executor Executor @@ -118,11 +119,11 @@ func (a *recordSet) NewChunk() *chunk.Chunk { func (a *recordSet) Close() error { err := a.executor.Close() - a.stmt.logSlowQuery(a.txnStartTS, a.lastErr == nil) + a.stmt.LogSlowQuery(a.txnStartTS, a.lastErr == nil) return errors.Trace(err) } -// ExecStmt implements the ast.Statement interface, it builds a planner.Plan to an ast.Statement. +// ExecStmt implements the sqlexec.Statement interface, it builds a planner.Plan to an sqlexec.Statement. type ExecStmt struct { // InfoSchema stores a reference to the schema information. InfoSchema infoschema.InfoSchema @@ -137,8 +138,9 @@ type ExecStmt struct { StmtNode ast.StmtNode - Ctx sessionctx.Context - startTime time.Time + Ctx sessionctx.Context + // StartTime stands for the starting time when executing the statement. + StartTime time.Time isPreparedStmt bool } @@ -182,9 +184,9 @@ func (a *ExecStmt) RebuildPlan() (int64, error) { // Exec builds an Executor from a plan. If the Executor doesn't return result, // like the INSERT, UPDATE statements, it executes in this function, if the Executor returns -// result, execution is done after this function returns, in the returned ast.RecordSet Next method. -func (a *ExecStmt) Exec(ctx context.Context) (ast.RecordSet, error) { - a.startTime = time.Now() +// result, execution is done after this function returns, in the returned sqlexec.RecordSet Next method. +func (a *ExecStmt) Exec(ctx context.Context) (sqlexec.RecordSet, error) { + a.StartTime = time.Now() sctx := a.Ctx if _, ok := a.Plan.(*plannercore.Analyze); ok && sctx.GetSessionVars().InRestrictedSQL { oriStats, _ := sctx.GetSessionVars().GetSystemVar(variable.TiDBBuildStatsConcurrency) @@ -246,7 +248,7 @@ func (a *ExecStmt) Exec(ctx context.Context) (ast.RecordSet, error) { }, nil } -func (a *ExecStmt) handleNoDelayExecutor(ctx context.Context, sctx sessionctx.Context, e Executor) (ast.RecordSet, error) { +func (a *ExecStmt) handleNoDelayExecutor(ctx context.Context, sctx sessionctx.Context, e Executor) (sqlexec.RecordSet, error) { // Check if "tidb_snapshot" is set for the write executors. // In history read mode, we can not do write operations. switch e.(type) { @@ -264,7 +266,7 @@ func (a *ExecStmt) handleNoDelayExecutor(ctx context.Context, sctx sessionctx.Co if sctx.Txn() != nil { txnTS = sctx.Txn().StartTS() } - a.logSlowQuery(txnTS, err == nil) + a.LogSlowQuery(txnTS, err == nil) }() err = e.Next(ctx, e.newFirstChunk()) @@ -329,13 +331,14 @@ func (a *ExecStmt) buildExecutor(ctx sessionctx.Context) (Executor, error) { // QueryReplacer replaces new line and tab for grep result including query string. var QueryReplacer = strings.NewReplacer("\r", " ", "\n", " ", "\t", " ") -func (a *ExecStmt) logSlowQuery(txnTS uint64, succ bool) { +// LogSlowQuery is used to print the slow query in the log files. +func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool) { level := log.GetLevel() if level < log.WarnLevel { return } cfg := config.GetGlobalConfig() - costTime := time.Since(a.startTime) + costTime := time.Since(a.StartTime) threshold := time.Duration(cfg.Log.SlowThreshold) * time.Millisecond if costTime < threshold && level < log.DebugLevel { return @@ -385,7 +388,7 @@ func (a *ExecStmt) logSlowQuery(txnTS uint64, succ bool) { } domain.GetDomain(a.Ctx).LogSlowQuery(&domain.SlowQueryInfo{ SQL: sql, - Start: a.startTime, + Start: a.StartTime, Duration: costTime, Detail: sessVars.StmtCtx.GetExecDetails(), Succ: succ, diff --git a/executor/admin.go b/executor/admin.go index 1fe645ae15de3..d7dd92d6cc36c 100644 --- a/executor/admin.go +++ b/executor/admin.go @@ -16,17 +16,17 @@ package executor import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/ranger" diff --git a/executor/admin_test.go b/executor/admin_test.go index 0a1282c582388..e80d9f84d0c5a 100644 --- a/executor/admin_test.go +++ b/executor/admin_test.go @@ -17,8 +17,8 @@ import ( "fmt" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" diff --git a/executor/aggfuncs/aggfunc_test.go b/executor/aggfuncs/aggfunc_test.go index ac4c1df5f6b22..2f40e218431b4 100644 --- a/executor/aggfuncs/aggfunc_test.go +++ b/executor/aggfuncs/aggfunc_test.go @@ -18,7 +18,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/parser" + "github.com/pingcap/parser" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/executor/aggfuncs/builder.go b/executor/aggfuncs/builder.go index ec6f4c4d76545..097c90affa782 100644 --- a/executor/aggfuncs/builder.go +++ b/executor/aggfuncs/builder.go @@ -17,10 +17,10 @@ import ( "fmt" "strconv" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" diff --git a/executor/aggfuncs/func_avg.go b/executor/aggfuncs/func_avg.go index f917c60e1d044..b31b0f96ed69a 100644 --- a/executor/aggfuncs/func_avg.go +++ b/executor/aggfuncs/func_avg.go @@ -15,7 +15,7 @@ package aggfuncs import ( "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" diff --git a/executor/aggfuncs/func_avg_test.go b/executor/aggfuncs/func_avg_test.go index 4b5b5667910c2..d51a2ff54c289 100644 --- a/executor/aggfuncs/func_avg_test.go +++ b/executor/aggfuncs/func_avg_test.go @@ -15,60 +15,15 @@ package aggfuncs_test import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" ) -func (s *testSuite) TestMergePartialResult4Count(c *C) { - srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 5) - for i := int64(0); i < 5; i++ { - srcChk.AppendInt64(0, i) - } - iter := chunk.NewIterator4Chunk(srcChk) - - desc := &aggregation.AggFuncDesc{ - Name: ast.AggFuncCount, - Mode: aggregation.CompleteMode, - Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLong), Index: 0}}, - } - finalDesc := desc.Split([]int{0}) - - // build count func for partial phase. - partialCountFunc := aggfuncs.Build(s.ctx, desc, 0) - partialPr1 := partialCountFunc.AllocPartialResult() - - // build final func for final phase. - finalCountFunc := aggfuncs.Build(s.ctx, finalDesc, 0) - finalPr := finalCountFunc.AllocPartialResult() - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 1) - - // update partial result. - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - partialCountFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) - } - partialCountFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) - c.Assert(resultChk.GetRow(0).GetInt64(0), Equals, int64(5)) - - // suppose there are two partial workers. - partialPr2 := partialPr1 - - // merge two partial results. - err := finalCountFunc.MergePartialResult(s.ctx, partialPr1, finalPr) - c.Assert(err, IsNil) - err = finalCountFunc.MergePartialResult(s.ctx, partialPr2, finalPr) - c.Assert(err, IsNil) - - resultChk.Reset() - err = finalCountFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - c.Assert(resultChk.GetRow(0).GetInt64(0), Equals, int64(10)) -} - func (s *testSuite) TestMergePartialResult4AvgDecimal(c *C) { srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 5) for i := int64(0); i < 5; i++ { @@ -180,168 +135,3 @@ func (s *testSuite) TestMergePartialResult4AvgFloat(c *C) { // (10 + 9) / 8 c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(2.375), IsTrue) } - -func (s *testSuite) TestMergePartialResult4SumDecimal(c *C) { - srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 5) - for i := int64(0); i < 5; i++ { - srcChk.AppendMyDecimal(0, types.NewDecFromInt(i)) - } - iter := chunk.NewIterator4Chunk(srcChk) - - desc := &aggregation.AggFuncDesc{ - Name: ast.AggFuncSum, - Mode: aggregation.CompleteMode, - Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLonglong), Index: 0}}, - RetTp: types.NewFieldType(mysql.TypeNewDecimal), - } - finalDesc := desc.Split([]int{0}) - - // build sum func for partial phase. - partialSumFunc := aggfuncs.Build(s.ctx, desc, 0) - partialPr1 := partialSumFunc.AllocPartialResult() - partialPr2 := partialSumFunc.AllocPartialResult() - - // build final func for final phase. - finalAvgFunc := aggfuncs.Build(s.ctx, finalDesc, 0) - finalPr := finalAvgFunc.AllocPartialResult() - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 1) - - // update partial result. - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) - } - // 0+1+2+3+4 - partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) - c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(10)) == 0, IsTrue) - - row := iter.Begin() - row = iter.Next() - for row = iter.Next(); row != iter.End(); row = iter.Next() { - partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) - } - resultChk.Reset() - // 2+3+4 - partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) - c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(9)) == 0, IsTrue) - - // merge two partial results. - err := finalAvgFunc.MergePartialResult(s.ctx, partialPr1, finalPr) - c.Assert(err, IsNil) - err = finalAvgFunc.MergePartialResult(s.ctx, partialPr2, finalPr) - c.Assert(err, IsNil) - - resultChk.Reset() - err = finalAvgFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - // 10+9 - c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(19)) == 0, IsTrue) -} - -func (s *testSuite) TestMergePartialResult4SumFloat(c *C) { - srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 5) - for i := int64(0); i < 5; i++ { - srcChk.AppendFloat64(0, float64(i)) - } - iter := chunk.NewIterator4Chunk(srcChk) - - desc := &aggregation.AggFuncDesc{ - Name: ast.AggFuncSum, - Mode: aggregation.CompleteMode, - Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}}, - RetTp: types.NewFieldType(mysql.TypeDouble), - } - finalDesc := desc.Split([]int{0}) - - // build sum func for partial phase. - partialSumFunc := aggfuncs.Build(s.ctx, desc, 0) - partialPr1 := partialSumFunc.AllocPartialResult() - partialPr2 := partialSumFunc.AllocPartialResult() - - // build final func for final phase. - finalAvgFunc := aggfuncs.Build(s.ctx, finalDesc, 0) - finalPr := finalAvgFunc.AllocPartialResult() - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 1) - - // update partial result. - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) - } - partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) - // (0+1+2+3+4) - c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(10), IsTrue) - - row := iter.Begin() - row = iter.Next() - for row = iter.Next(); row != iter.End(); row = iter.Next() { - partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) - } - resultChk.Reset() - partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) - // (2+3+4) - c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(9), IsTrue) - - // merge two partial results. - err := finalAvgFunc.MergePartialResult(s.ctx, partialPr1, finalPr) - c.Assert(err, IsNil) - err = finalAvgFunc.MergePartialResult(s.ctx, partialPr2, finalPr) - c.Assert(err, IsNil) - - resultChk.Reset() - err = finalAvgFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - // (10 + 9) - c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(19), IsTrue) -} - -func (s *testSuite) TestMergePartialResult4MaxFloat(c *C) { - srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 5) - for i := int64(0); i < 5; i++ { - srcChk.AppendFloat64(0, float64(i)) - } - iter := chunk.NewIterator4Chunk(srcChk) - - desc := &aggregation.AggFuncDesc{ - Name: ast.AggFuncMax, - Mode: aggregation.CompleteMode, - Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}}, - RetTp: types.NewFieldType(mysql.TypeDouble), - } - finalDesc := desc.Split([]int{0}) - - // build max func for partial phase. - partialMaxFunc := aggfuncs.Build(s.ctx, desc, 0) - partialPr1 := partialMaxFunc.AllocPartialResult() - partialPr2 := partialMaxFunc.AllocPartialResult() - - // build final func for final phase. - finalAvgFunc := aggfuncs.Build(s.ctx, finalDesc, 0) - finalPr := finalAvgFunc.AllocPartialResult() - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 1) - - // update partial result. - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - partialMaxFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) - } - partialMaxFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) - c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(4), IsTrue) - - row := iter.Begin() - row = iter.Next() - for row = iter.Next(); row != iter.End(); row = iter.Next() { - partialMaxFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) - } - resultChk.Reset() - partialMaxFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) - c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(4), IsTrue) - - // merge two partial results. - err := finalAvgFunc.MergePartialResult(s.ctx, partialPr1, finalPr) - c.Assert(err, IsNil) - err = finalAvgFunc.MergePartialResult(s.ctx, partialPr2, finalPr) - c.Assert(err, IsNil) - - resultChk.Reset() - err = finalAvgFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(4), IsTrue) -} diff --git a/executor/aggfuncs/func_count_test.go b/executor/aggfuncs/func_count_test.go new file mode 100644 index 0000000000000..38a7c91bf8097 --- /dev/null +++ b/executor/aggfuncs/func_count_test.go @@ -0,0 +1,70 @@ +// 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 aggfuncs_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/executor/aggfuncs" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" +) + +func (s *testSuite) TestMergePartialResult4Count(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendInt64(0, i) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncCount, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLong), Index: 0}}, + } + finalDesc := desc.Split([]int{0}) + + // build count func for partial phase. + partialCountFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialCountFunc.AllocPartialResult() + + // build final func for final phase. + finalCountFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalCountFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialCountFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + partialCountFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + c.Assert(resultChk.GetRow(0).GetInt64(0), Equals, int64(5)) + + // suppose there are two partial workers. + partialPr2 := partialPr1 + + // merge two partial results. + err := finalCountFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalCountFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalCountFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + c.Assert(resultChk.GetRow(0).GetInt64(0), Equals, int64(10)) +} diff --git a/executor/aggfuncs/func_max_min_test.go b/executor/aggfuncs/func_max_min_test.go new file mode 100644 index 0000000000000..1f9183c3497cf --- /dev/null +++ b/executor/aggfuncs/func_max_min_test.go @@ -0,0 +1,241 @@ +// 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 aggfuncs_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/executor/aggfuncs" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" +) + +func (s *testSuite) TestMergePartialResult4MaxDecimal(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendMyDecimal(0, types.NewDecFromInt(i)) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncMax, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLonglong), Index: 0}}, + RetTp: types.NewFieldType(mysql.TypeNewDecimal), + } + finalDesc := desc.Split([]int{0}) + + // build max func for partial phase. + partialMaxFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialMaxFunc.AllocPartialResult() + partialPr2 := partialMaxFunc.AllocPartialResult() + + // build final func for final phase. + finalMaxFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalMaxFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialMaxFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + partialMaxFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(4)) == 0, IsTrue) + + row := iter.Begin() + row = iter.Next() + for row = iter.Next(); row != iter.End(); row = iter.Next() { + partialMaxFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) + } + resultChk.Reset() + partialMaxFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(4)) == 0, IsTrue) + + // merge two partial results. + err := finalMaxFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalMaxFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalMaxFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(4)) == 0, IsTrue) +} + +func (s *testSuite) TestMergePartialResult4MaxFloat(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendFloat64(0, float64(i)) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncMax, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}}, + RetTp: types.NewFieldType(mysql.TypeDouble), + } + finalDesc := desc.Split([]int{0}) + + // build max func for partial phase. + partialMaxFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialMaxFunc.AllocPartialResult() + partialPr2 := partialMaxFunc.AllocPartialResult() + + // build final func for final phase. + finalMaxFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalMaxFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialMaxFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + partialMaxFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(4), IsTrue) + + row := iter.Begin() + row = iter.Next() + for row = iter.Next(); row != iter.End(); row = iter.Next() { + partialMaxFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) + } + resultChk.Reset() + partialMaxFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(4), IsTrue) + + // merge two partial results. + err := finalMaxFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalMaxFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalMaxFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(4), IsTrue) +} + +func (s *testSuite) TestMergePartialResult4MinDecimal(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendMyDecimal(0, types.NewDecFromInt(i)) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncMin, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLonglong), Index: 0}}, + RetTp: types.NewFieldType(mysql.TypeNewDecimal), + } + finalDesc := desc.Split([]int{0}) + + // build min func for partial phase. + partialMinFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialMinFunc.AllocPartialResult() + partialPr2 := partialMinFunc.AllocPartialResult() + + // build final func for final phase. + finalMinFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalMinFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialMinFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + partialMinFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(0)) == 0, IsTrue) + + row := iter.Begin() + row = iter.Next() + for row = iter.Next(); row != iter.End(); row = iter.Next() { + partialMinFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) + } + resultChk.Reset() + partialMinFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) + // Min in [2,3,4] -> 2 + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(2)) == 0, IsTrue) + + // merge two partial results. + err := finalMinFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalMinFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalMinFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + // Min in [0,1,2,3,4] -> 0 + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(0)) == 0, IsTrue) +} + +func (s *testSuite) TestMergePartialResult4MinFloat(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendFloat64(0, float64(i)) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncMin, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}}, + RetTp: types.NewFieldType(mysql.TypeDouble), + } + finalDesc := desc.Split([]int{0}) + + // build min func for partial phase. + partialMinFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialMinFunc.AllocPartialResult() + partialPr2 := partialMinFunc.AllocPartialResult() + + // build final func for final phase. + finalMinFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalMinFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialMinFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + partialMinFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(0), IsTrue) + + row := iter.Begin() + row = iter.Next() + for row = iter.Next(); row != iter.End(); row = iter.Next() { + partialMinFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) + } + resultChk.Reset() + partialMinFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) + // Min in [2.0,3.0,4.0] -> 0 + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(2), IsTrue) + + // merge two partial results. + err := finalMinFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalMinFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalMinFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + // Min in [0.0,1.0,2.0,3.0,4.0] -> 0 + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(0), IsTrue) +} diff --git a/executor/aggfuncs/func_sum_test.go b/executor/aggfuncs/func_sum_test.go new file mode 100644 index 0000000000000..c6181a11529be --- /dev/null +++ b/executor/aggfuncs/func_sum_test.go @@ -0,0 +1,137 @@ +// 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 aggfuncs_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/executor/aggfuncs" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" +) + +func (s *testSuite) TestMergePartialResult4SumDecimal(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendMyDecimal(0, types.NewDecFromInt(i)) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncSum, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeLonglong), Index: 0}}, + RetTp: types.NewFieldType(mysql.TypeNewDecimal), + } + finalDesc := desc.Split([]int{0}) + + // build sum func for partial phase. + partialSumFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialSumFunc.AllocPartialResult() + partialPr2 := partialSumFunc.AllocPartialResult() + + // build final func for final phase. + finalAvgFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalAvgFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + // 0+1+2+3+4 + partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(10)) == 0, IsTrue) + + row := iter.Begin() + row = iter.Next() + for row = iter.Next(); row != iter.End(); row = iter.Next() { + partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) + } + resultChk.Reset() + // 2+3+4 + partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(9)) == 0, IsTrue) + + // merge two partial results. + err := finalAvgFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalAvgFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalAvgFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + // 10+9 + c.Assert(resultChk.GetRow(0).GetMyDecimal(0).Compare(types.NewDecFromInt(19)) == 0, IsTrue) +} + +func (s *testSuite) TestMergePartialResult4SumFloat(c *C) { + srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 5) + for i := int64(0); i < 5; i++ { + srcChk.AppendFloat64(0, float64(i)) + } + iter := chunk.NewIterator4Chunk(srcChk) + + desc := &aggregation.AggFuncDesc{ + Name: ast.AggFuncSum, + Mode: aggregation.CompleteMode, + Args: []expression.Expression{&expression.Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}}, + RetTp: types.NewFieldType(mysql.TypeDouble), + } + finalDesc := desc.Split([]int{0}) + + // build sum func for partial phase. + partialSumFunc := aggfuncs.Build(s.ctx, desc, 0) + partialPr1 := partialSumFunc.AllocPartialResult() + partialPr2 := partialSumFunc.AllocPartialResult() + + // build final func for final phase. + finalAvgFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalPr := finalAvgFunc.AllocPartialResult() + resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 1) + + // update partial result. + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr1) + } + partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr1, resultChk) + // (0+1+2+3+4) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(10), IsTrue) + + row := iter.Begin() + row = iter.Next() + for row = iter.Next(); row != iter.End(); row = iter.Next() { + partialSumFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialPr2) + } + resultChk.Reset() + partialSumFunc.AppendFinalResult2Chunk(s.ctx, partialPr2, resultChk) + // (2+3+4) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(9), IsTrue) + + // merge two partial results. + err := finalAvgFunc.MergePartialResult(s.ctx, partialPr1, finalPr) + c.Assert(err, IsNil) + err = finalAvgFunc.MergePartialResult(s.ctx, partialPr2, finalPr) + c.Assert(err, IsNil) + + resultChk.Reset() + err = finalAvgFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) + // (10 + 9) + c.Assert(resultChk.GetRow(0).GetFloat64(0) == float64(19), IsTrue) +} diff --git a/executor/aggregate.go b/executor/aggregate.go index c9b148e027901..a72ad4f0d37a2 100644 --- a/executor/aggregate.go +++ b/executor/aggregate.go @@ -17,9 +17,9 @@ import ( "sync" "time" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" @@ -502,9 +502,9 @@ func (w *HashAggFinalWorker) run(ctx sessionctx.Context, waitGroup *sync.WaitGro // Next implements the Executor Next interface. func (e *HashAggExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if e.isUnparallelExec { @@ -761,9 +761,9 @@ func (e *StreamAggExec) Close() error { // Next implements the Executor Next interface. func (e *StreamAggExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() for !e.executed && chk.NumRows() < e.maxChunkSize { diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index 9b2d861907bcf..1e049fb9d5673 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -15,8 +15,8 @@ package executor_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" plannercore "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/testkit" ) @@ -377,6 +377,11 @@ func (s *testSuite) TestAggPrune(c *C) { tk.MustExec("create table t(id int primary key, b float, c float, d float)") tk.MustExec("insert into t values(1, 1, 3, NULL), (2, 1, NULL, 6), (3, NULL, 1, 2), (4, NULL, NULL, 1), (5, NULL, 2, NULL), (6, 3, NULL, NULL), (7, NULL, NULL, NULL), (8, 1, 2 ,3)") tk.MustQuery("select count(distinct b, c, d) from t group by id").Check(testkit.Rows("0", "0", "0", "0", "0", "0", "0", "1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key, b varchar(10))") + tk.MustExec("insert into t value(1, 11),(3, NULL)") + tk.MustQuery("SELECT a, MIN(b), MAX(b) FROM t GROUP BY a").Check(testkit.Rows("1 11 11", "3 ")) } func (s *testSuite) TestGroupConcatAggr(c *C) { diff --git a/executor/analyze.go b/executor/analyze.go index 12e49ff22649d..85fa0987cfe88 100644 --- a/executor/analyze.go +++ b/executor/analyze.go @@ -17,11 +17,11 @@ import ( "runtime" "strconv" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" diff --git a/executor/analyze_test.go b/executor/analyze_test.go index 52813d4fa9106..c5ba232fb07de 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -15,9 +15,12 @@ package executor_test import ( "fmt" + "strings" + . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/testkit" @@ -107,3 +110,21 @@ func (s *testSuite) TestAnalyzeParameters(c *C) { tbl = s.domain.StatsHandle().GetTableStats(tableInfo) c.Assert(tbl.Columns[1].Len(), Equals, 4) } + +func (s *testSuite) TestAnalyzeTooLongColumns(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 json)") + value := fmt.Sprintf(`{"x":"%s"}`, strings.Repeat("x", mysql.MaxFieldVarCharLength)) + tk.MustExec(fmt.Sprintf("insert into t values ('%s')", value)) + + tk.MustExec("analyze table t") + is := executor.GetInfoSchema(tk.Se.(sessionctx.Context)) + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := table.Meta() + tbl := s.domain.StatsHandle().GetTableStats(tableInfo) + c.Assert(tbl.Columns[1].Len(), Equals, 0) + c.Assert(tbl.Columns[1].TotColSize, Equals, int64(65559)) +} diff --git a/executor/batch_checker.go b/executor/batch_checker.go index 6f3ae9254ff2b..558e25884a55e 100644 --- a/executor/batch_checker.go +++ b/executor/batch_checker.go @@ -14,8 +14,8 @@ package executor import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" diff --git a/executor/builder.go b/executor/builder.go index ecef2551d2f48..fed4e0771654f 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -24,7 +24,9 @@ import ( "github.com/cznic/mathutil" "github.com/cznic/sortutil" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor/aggfuncs" @@ -33,8 +35,6 @@ import ( "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" @@ -548,6 +548,11 @@ func (b *executorBuilder) buildInsert(v *plannercore.Insert) Executor { hasRefCols: v.NeedFillDefaultValue, SelectExec: selectExec, } + err := ivs.initInsertColumns() + if err != nil { + b.err = err + return nil + } if v.IsReplace { return b.buildReplace(ivs) @@ -572,17 +577,16 @@ func (b *executorBuilder) buildLoadData(v *plannercore.LoadData) Executor { GenColumns: v.GenCols.Columns, GenExprs: v.GenCols.Exprs, } - tableCols := tbl.Cols() - columns, err := insertVal.getColumns(tableCols) + err := insertVal.initInsertColumns() if err != nil { - b.err = errors.Trace(err) + b.err = err return nil } loadDataExec := &LoadDataExec{ baseExecutor: newBaseExecutor(b.ctx, nil, v.ExplainID()), IsLocal: v.IsLocal, loadDataInfo: &LoadDataInfo{ - row: make([]types.Datum, len(columns)), + row: make([]types.Datum, len(insertVal.insertColumns)), InsertValues: insertVal, Path: v.Path, Table: tbl, @@ -590,7 +594,6 @@ func (b *executorBuilder) buildLoadData(v *plannercore.LoadData) Executor { LinesInfo: v.LinesInfo, IgnoreLines: v.IgnoreLines, Ctx: b.ctx, - columns: columns, }, } @@ -659,41 +662,15 @@ func (b *executorBuilder) buildTrace(v *plannercore.Trace) Executor { // buildExplain builds a explain executor. `e.rows` collects final result to `ExplainExec`. func (b *executorBuilder) buildExplain(v *plannercore.Explain) Executor { - if v.Analyze { - stmt := &ExecStmt{ - InfoSchema: GetInfoSchema(b.ctx), - Plan: v.ExecPlan, - StmtNode: v.ExecStmt, - Ctx: b.ctx, - } - b.ctx.GetSessionVars().StmtCtx.RuntimeStats = execdetails.NewRuntimeStats() - ctx := context.Background() - rs, err := stmt.Exec(ctx) - if err != nil { - return nil - } - if rs != nil { - chk := rs.NewChunk() - for { - err := rs.Next(ctx, chk) - if err != nil { - return nil - } - if chk.NumRows() == 0 { - break - } - } - } - } - v.PrepareRows() - e := &ExplainExec{ + explainExec := &ExplainExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID()), + explain: v, } - e.rows = make([][]string, 0, len(v.Rows)) - for _, row := range v.Rows { - e.rows = append(e.rows, row) + if v.Analyze { + b.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl = execdetails.NewRuntimeStatsColl() + explainExec.analyzeExec = b.build(v.ExecPlan) } - return e + return explainExec } func (b *executorBuilder) buildUnionScanExec(v *plannercore.PhysicalUnionScan) Executor { @@ -702,10 +679,19 @@ func (b *executorBuilder) buildUnionScanExec(v *plannercore.PhysicalUnionScan) E b.err = errors.Trace(b.err) return nil } - return b.buildUnionScanFromReader(reader, v) + us, err := b.buildUnionScanFromReader(reader, v) + if err != nil { + b.err = err + return nil + } + return us } -func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannercore.PhysicalUnionScan) Executor { +// buildUnionScanFromReader builds union scan executor from child executor. +// Note that this function may be called by inner workers of index lookup join concurrently. +// Be careful to avoid data race. +func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannercore.PhysicalUnionScan) (Executor, error) { + var err error us := &UnionScanExec{baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ExplainID(), reader)} // Get the handle column index of the below plannercore. // We can guarantee that there must be only one col in the map. @@ -715,10 +701,16 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco switch x := reader.(type) { case *TableReaderExecutor: us.desc = x.desc + // Union scan can only be in a write transaction, so DirtyDB should has non-nil value now, thus + // GetDirtyDB() is safe here. If this table has been modified in the transaction, non-nil DirtyTable + // can be found in DirtyDB now, so GetDirtyTable is safe; if this table has not been modified in the + // transaction, empty DirtyTable would be inserted into DirtyDB, it does not matter when multiple + // goroutines write empty DirtyTable to DirtyDB for this table concurrently. Thus we don't use lock + // to synchronize here. us.dirty = GetDirtyDB(b.ctx).GetDirtyTable(x.table.Meta().ID) us.conditions = v.Conditions us.columns = x.columns - b.err = us.buildAndSortAddedRows() + err = us.buildAndSortAddedRows() case *IndexReaderExecutor: us.desc = x.desc for _, ic := range x.index.Columns { @@ -732,7 +724,7 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco us.dirty = GetDirtyDB(b.ctx).GetDirtyTable(x.table.Meta().ID) us.conditions = v.Conditions us.columns = x.columns - b.err = us.buildAndSortAddedRows() + err = us.buildAndSortAddedRows() case *IndexLookUpExecutor: us.desc = x.desc for _, ic := range x.index.Columns { @@ -746,16 +738,16 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco us.dirty = GetDirtyDB(b.ctx).GetDirtyTable(x.table.Meta().ID) us.conditions = v.Conditions us.columns = x.columns - b.err = us.buildAndSortAddedRows() + err = us.buildAndSortAddedRows() default: // The mem table will not be written by sql directly, so we can omit the union scan to avoid err reporting. - return reader + return reader, nil } - if b.err != nil { - b.err = errors.Trace(b.err) - return nil + if err != nil { + err = errors.Trace(err) + return nil, err } - return us + return us, nil } // buildMergeJoin builds MergeJoinExec executor. @@ -1853,14 +1845,14 @@ func (builder *dataReaderBuilder) buildExecutorForIndexJoin(ctx context.Context, func (builder *dataReaderBuilder) buildUnionScanForIndexJoin(ctx context.Context, v *plannercore.PhysicalUnionScan, values [][]types.Datum, indexRanges []*ranger.Range, keyOff2IdxOff []int) (Executor, error) { - builder.Plan = v.Children()[0] - reader, err := builder.buildExecutorForIndexJoin(ctx, values, indexRanges, keyOff2IdxOff) + childBuilder := &dataReaderBuilder{v.Children()[0], builder.executorBuilder} + reader, err := childBuilder.buildExecutorForIndexJoin(ctx, values, indexRanges, keyOff2IdxOff) if err != nil { - return nil, errors.Trace(err) + return nil, err } - e := builder.buildUnionScanFromReader(reader, v) - if e == nil { - return nil, builder.err + e, err := builder.buildUnionScanFromReader(reader, v) + if err != nil { + return nil, err } us := e.(*UnionScanExec) us.snapshotChunkBuffer = us.newFirstChunk() diff --git a/executor/checksum.go b/executor/checksum.go index 04c5d18dc2dcd..e9d6832096339 100644 --- a/executor/checksum.go +++ b/executor/checksum.go @@ -16,9 +16,9 @@ package executor import ( "strconv" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/chunk" diff --git a/executor/compiler.go b/executor/compiler.go index 3db47c7070904..778a555e74194 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -17,7 +17,7 @@ import ( "fmt" "github.com/opentracing/opentracing-go" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/metrics" diff --git a/executor/ddl.go b/executor/ddl.go index d972c69a7b18e..ba7e9c02390c0 100644 --- a/executor/ddl.go +++ b/executor/ddl.go @@ -17,12 +17,12 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -67,6 +67,11 @@ func (e *DDLExec) Next(ctx context.Context, chk *chunk.Chunk) (err error) { return nil } e.done = true + + // For each DDL, we should commit the previous transaction and create a new transaction. + if err = e.ctx.NewTxn(); err != nil { + return errors.Trace(err) + } defer func() { e.ctx.GetSessionVars().StmtCtx.IsDDLJobInQueue = false }() switch x := e.stmt.(type) { diff --git a/executor/ddl_test.go b/executor/ddl_test.go index b91a57b4b1559..9c9a6e42be2e6 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -20,13 +20,13 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testkit" @@ -46,6 +46,23 @@ func (s *testSuite) TestTruncateTable(c *C) { result.Check(nil) } +// TestInTxnExecDDLFail tests the following case: +// 1. Execute the SQL of "begin"; +// 2. A SQL that will fail to execute; +// 3. Execute DDL. +func (s *testSuite) TestInTxnExecDDLFail(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t (i int key);") + tk.MustExec("insert into t values (1);") + tk.MustExec("begin;") + tk.MustExec("insert into t values (1);") + _, err := tk.Exec("truncate table t;") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'") + result := tk.MustQuery("select count(*) from t") + result.Check(testkit.Rows("1")) +} + func (s *testSuite) TestCreateTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") diff --git a/executor/delete.go b/executor/delete.go index 026a1975666d8..991e2f2817ed5 100644 --- a/executor/delete.go +++ b/executor/delete.go @@ -14,7 +14,7 @@ package executor import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" @@ -216,14 +216,6 @@ func (e *DeleteExec) removeRow(ctx sessionctx.Context, t table.Table, h int64, d return errors.Trace(err) } ctx.GetSessionVars().StmtCtx.AddAffectedRows(1) - colSize := make(map[int64]int64) - for id, col := range t.Cols() { - val := -int64(len(data[id].GetBytes())) - if val != 0 { - colSize[col.ID] = val - } - } - ctx.GetSessionVars().TxnCtx.UpdateDeltaForTable(t.Meta().ID, -1, 1, colSize) return nil } diff --git a/executor/distsql.go b/executor/distsql.go index 0553fb9658e12..89caee248ecf1 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -22,17 +22,17 @@ import ( "time" "unsafe" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/memory" @@ -244,9 +244,9 @@ func (e *IndexReaderExecutor) Close() error { // Next implements the Executor Next interface. func (e *IndexReaderExecutor) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } err := e.result.Next(ctx, chk) if err != nil { @@ -458,7 +458,6 @@ func (e *IndexLookUpExecutor) startIndexWorker(ctx context.Context, kvRanges []k func (e *IndexLookUpExecutor) startTableWorker(ctx context.Context, workCh <-chan *lookupTableTask) { lookupConcurrencyLimit := e.ctx.GetSessionVars().IndexLookupConcurrency e.tblWorkerWg.Add(lookupConcurrencyLimit) - e.baseExecutor.ctx.GetSessionVars().StmtCtx.RuntimeStats.GetRuntimeStat(e.id + "_tableReader") for i := 0; i < lookupConcurrencyLimit; i++ { worker := &tableWorker{ workCh: workCh, @@ -480,7 +479,7 @@ func (e *IndexLookUpExecutor) startTableWorker(ctx context.Context, workCh <-cha } func (e *IndexLookUpExecutor) buildTableReader(ctx context.Context, handles []int64) (Executor, error) { - tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, &TableReaderExecutor{ + tableReaderExec := &TableReaderExecutor{ baseExecutor: newBaseExecutor(e.ctx, e.schema, e.id+"_tableReader"), table: e.table, physicalTableID: e.physicalTableID, @@ -489,7 +488,11 @@ func (e *IndexLookUpExecutor) buildTableReader(ctx context.Context, handles []in feedback: statistics.NewQueryFeedback(0, nil, 0, false), corColInFilter: e.corColInTblSide, plans: e.tblPlans, - }, handles) + } + // We assign `nil` to `runtimeStats` to forbidden `TableWorker` driven `IndexLookupExecutor`'s runtime stats collecting, + // because TableWorker information isn't showing in explain result now. + tableReaderExec.runtimeStats = nil + tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, tableReaderExec, handles) if err != nil { log.Error(err) return nil, errors.Trace(err) @@ -518,9 +521,9 @@ func (e *IndexLookUpExecutor) Close() error { // Next implements Exec Next interface. func (e *IndexLookUpExecutor) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() for { diff --git a/executor/distsql_test.go b/executor/distsql_test.go index 070c10233e1be..c4b29c80071ca 100644 --- a/executor/distsql_test.go +++ b/executor/distsql_test.go @@ -22,9 +22,9 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/testkit" diff --git a/executor/errors.go b/executor/errors.go index ec8482ac56a44..ff7ae49e4de39 100644 --- a/executor/errors.go +++ b/executor/errors.go @@ -14,8 +14,8 @@ package executor import ( - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" ) // Error codes that are not mapping to mysql error codes. diff --git a/executor/executor.go b/executor/executor.go index 9e39bf2daeec8..83381ed6b5046 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -21,21 +21,21 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/chunk" @@ -78,7 +78,7 @@ type baseExecutor struct { maxChunkSize int children []Executor retFieldTypes []*types.FieldType - runtimeStat *execdetails.RuntimeStat + runtimeStats *execdetails.RuntimeStats } // Open initializes children recursively and "childrenResults" according to children's schemas. @@ -134,7 +134,9 @@ func newBaseExecutor(ctx sessionctx.Context, schema *expression.Schema, id strin schema: schema, initCap: ctx.GetSessionVars().MaxChunkSize, maxChunkSize: ctx.GetSessionVars().MaxChunkSize, - runtimeStat: ctx.GetSessionVars().StmtCtx.RuntimeStats.GetRuntimeStat(id), + } + if ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { + e.runtimeStats = e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.Get(e.id) } if schema != nil { cols := schema.Columns @@ -177,9 +179,9 @@ type CancelDDLJobsExec struct { // Next implements the Executor Next interface. func (e *CancelDDLJobsExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.GrowAndReset(e.maxChunkSize) if e.cursor >= len(e.jobIDs) { @@ -370,7 +372,7 @@ type CheckTableExec struct { done bool is infoschema.InfoSchema - genExprs map[string]expression.Expression + genExprs map[model.TableColumnID]expression.Expression } // Open implements the Executor Open interface. @@ -623,9 +625,9 @@ type LimitExec struct { // Next implements the Executor Next interface. func (e *LimitExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if e.cursor >= e.end { @@ -746,9 +748,9 @@ func (e *TableDualExec) Open(ctx context.Context) error { // Next implements the Executor Next interface. func (e *TableDualExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if e.numReturned >= e.numDualRows { @@ -801,9 +803,9 @@ func (e *SelectionExec) Close() error { // Next implements the Executor Next interface. func (e *SelectionExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.GrowAndReset(e.maxChunkSize) @@ -880,9 +882,9 @@ type TableScanExec struct { // Next implements the Executor Next interface. func (e *TableScanExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.GrowAndReset(e.maxChunkSize) if e.isVirtualTable { @@ -984,9 +986,9 @@ func (e *MaxOneRowExec) Open(ctx context.Context) error { // Next implements the Executor Next interface. func (e *MaxOneRowExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if e.evaluated { @@ -1130,9 +1132,9 @@ func (e *UnionExec) resultPuller(ctx context.Context, childID int) { // Next implements the Executor Next interface. func (e *UnionExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.GrowAndReset(e.maxChunkSize) if !e.initialized { diff --git a/executor/executor_pkg_test.go b/executor/executor_pkg_test.go index bd79e219420b0..b699cee269ca3 100644 --- a/executor/executor_pkg_test.go +++ b/executor/executor_pkg_test.go @@ -17,14 +17,14 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/ranger" diff --git a/executor/executor_test.go b/executor/executor_test.go index dcbfec3fbd61b..844d68c61f4b0 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -29,14 +29,15 @@ import ( "github.com/golang/protobuf/proto" . "github.com/pingcap/check" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/parser" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/planner" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" @@ -51,7 +52,6 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/codec" @@ -301,6 +301,15 @@ func (s *testSuite) TestAdmin(c *C) { tk.MustExec("alter table t1 add index idx_i(i);") tk.MustExec("alter table t1 add index idx_m(a,c,d,e,f,g,h,i,j);") tk.MustExec("admin check table t1;") + + tk.MustExec("drop table if exists t1;") + tk.MustExec("CREATE TABLE t1 (c1 int);") + tk.MustExec("INSERT INTO t1 SET c1 = 1;") + tk.MustExec("ALTER TABLE t1 ADD COLUMN cc1 CHAR(36) NULL DEFAULT '';") + tk.MustExec("ALTER TABLE t1 ADD COLUMN cc2 VARCHAR(36) NULL DEFAULT ''") + tk.MustExec("ALTER TABLE t1 ADD INDEX idx1 (cc1);") + tk.MustExec("ALTER TABLE t1 ADD INDEX idx2 (cc2);") + tk.MustExec("admin check table t1;") } func (s *testSuite) fillData(tk *testkit.TestKit, table string) { @@ -702,6 +711,10 @@ func (s *testSuite) TestSelectOrderBy(c *C) { r = tk.MustQuery("select * from select_order_test order by name, id limit 1 offset 100;") r.Check(testkit.Rows()) + // Test limit exceeds int range. + r = tk.MustQuery("select id from select_order_test order by name, id limit 18446744073709551615;") + r.Check(testkit.Rows("1", "2")) + // Test multiple field r = tk.MustQuery("select id, name from select_order_test where id = 1 group by id, name limit 1 offset 0;") r.Check(testkit.Rows("1 hello")) @@ -1048,6 +1061,26 @@ func (s *testSuite) TestUnion(c *C) { tk.MustQuery("select 1 union select 1 union all select 1").Check(testkit.Rows("1", "1")) tk.MustQuery("select 1 union all select 1 union select 1").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t1, t2") + tk.MustExec(`create table t1(a bigint, b bigint);`) + tk.MustExec(`create table t2(a bigint, b bigint);`) + tk.MustExec(`insert into t1 values(1, 1);`) + tk.MustExec(`insert into t1 select * from t1;`) + tk.MustExec(`insert into t1 select * from t1;`) + tk.MustExec(`insert into t1 select * from t1;`) + tk.MustExec(`insert into t1 select * from t1;`) + tk.MustExec(`insert into t1 select * from t1;`) + tk.MustExec(`insert into t1 select * from t1;`) + tk.MustExec(`insert into t2 values(1, 1);`) + tk.MustExec(`set @@tidb_max_chunk_size=2;`) + tk.MustQuery(`select count(*) from (select t1.a, t1.b from t1 left join t2 on t1.a=t2.a union all select t1.a, t1.a from t1 left join t2 on t1.a=t2.a) tmp;`).Check(testkit.Rows("128")) + tk.MustQuery(`select tmp.a, count(*) from (select t1.a, t1.b from t1 left join t2 on t1.a=t2.a union all select t1.a, t1.a from t1 left join t2 on t1.a=t2.a) tmp;`).Check(testkit.Rows("1 128")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t value(1 ,2)") + tk.MustQuery("select a, b from (select a, 0 as d, b from t union all select a, 0 as d, b from t) test;").Check(testkit.Rows("1 2", "1 2")) } func (s *testSuite) TestIn(c *C) { diff --git a/executor/explain.go b/executor/explain.go index afc3f871e0883..019e07a655744 100644 --- a/executor/explain.go +++ b/executor/explain.go @@ -15,6 +15,7 @@ package executor import ( "github.com/cznic/mathutil" + "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/util/chunk" "golang.org/x/net/context" ) @@ -23,18 +24,39 @@ import ( type ExplainExec struct { baseExecutor - rows [][]string - cursor int + explain *core.Explain + analyzeExec Executor + rows [][]string + cursor int +} + +// Open implements the Executor Open interface. +func (e *ExplainExec) Open(ctx context.Context) error { + if e.analyzeExec != nil { + return e.analyzeExec.Open(ctx) + } + return nil } // Close implements the Executor Close interface. func (e *ExplainExec) Close() error { + if e.analyzeExec != nil { + e.analyzeExec.Close() + } e.rows = nil return nil } // Next implements the Executor Next interface. func (e *ExplainExec) Next(ctx context.Context, chk *chunk.Chunk) error { + if e.rows == nil { + var err error + e.rows, err = e.generateExplainInfo(ctx) + if err != nil { + return err + } + } + chk.GrowAndReset(e.maxChunkSize) if e.cursor >= len(e.rows) { return nil @@ -49,3 +71,23 @@ func (e *ExplainExec) Next(ctx context.Context, chk *chunk.Chunk) error { e.cursor += numCurRows return nil } + +func (e *ExplainExec) generateExplainInfo(ctx context.Context) ([][]string, error) { + if e.analyzeExec != nil { + chk := e.analyzeExec.newFirstChunk() + for { + err := e.analyzeExec.Next(ctx, chk) + if err != nil { + return nil, err + } + if chk.NumRows() == 0 { + break + } + } + } + e.explain.RenderResult() + if e.analyzeExec != nil { + e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl = nil + } + return e.explain.Rows, nil +} diff --git a/executor/grant.go b/executor/grant.go index 8bff64ddba034..2886e1de36791 100644 --- a/executor/grant.go +++ b/executor/grant.go @@ -17,11 +17,11 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util/chunk" diff --git a/executor/grant_test.go b/executor/grant_test.go index db198f94f454e..bb3d33262ebea 100644 --- a/executor/grant_test.go +++ b/executor/grant_test.go @@ -18,7 +18,7 @@ import ( "strings" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/util/testkit" ) diff --git a/executor/index_lookup_join.go b/executor/index_lookup_join.go index 5585e119209cb..7fcb4bb08bac5 100644 --- a/executor/index_lookup_join.go +++ b/executor/index_lookup_join.go @@ -21,11 +21,11 @@ import ( "time" "unsafe" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" @@ -190,9 +190,9 @@ func (e *IndexLookUpJoin) newInnerWorker(taskCh chan *lookUpJoinTask) *innerWork // Next implements the Executor interface. func (e *IndexLookUpJoin) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() e.joinResult.Reset() diff --git a/executor/index_lookup_join_test.go b/executor/index_lookup_join_test.go index 203c6aa79b103..319e6e60e56c8 100644 --- a/executor/index_lookup_join_test.go +++ b/executor/index_lookup_join_test.go @@ -91,3 +91,29 @@ func (s *testSuite) TestIndexJoinUnionScan(c *C) { )) tk.MustExec("rollback") } + +func (s *testSuite) TestBatchIndexJoinUnionScan(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("create table t1(id int primary key, a int)") + tk.MustExec("create table t2(id int primary key, a int, key idx_a(a))") + tk.MustExec("set @@session.tidb_max_chunk_size=1") + tk.MustExec("set @@session.tidb_index_join_batch_size=1") + tk.MustExec("set @@session.tidb_index_lookup_join_concurrency=4") + tk.MustExec("begin") + tk.MustExec("insert into t1 values(1,1),(2,1),(3,1),(4,1)") + tk.MustExec("insert into t2 values(1,1)") + tk.MustQuery("explain select /*+ TIDB_INLJ(t1, t2)*/ count(*) from t1 join t2 on t1.a = t2.a").Check(testkit.Rows( + "StreamAgg_13 1.00 root funcs:count(1)", + "└─IndexJoin_24 12500.00 root inner join, inner:UnionScan_23, outer key:test.t1.a, inner key:test.t2.a", + " ├─UnionScan_25 10000.00 root ", + " │ └─TableReader_27 10000.00 root data:TableScan_26", + " │ └─TableScan_26 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + " └─UnionScan_23 10.00 root ", + " └─IndexReader_22 10.00 root index:IndexScan_21", + " └─IndexScan_21 10.00 cop table:t2, index:a, range: decided by [test.t1.a], keep order:false, stats:pseudo", + )) + tk.MustQuery("select /*+ TIDB_INLJ(t1, t2)*/ count(*) from t1 join t2 on t1.a = t2.id").Check(testkit.Rows( + "4", + )) + tk.MustExec("rollback") +} diff --git a/executor/insert.go b/executor/insert.go index 932a2c09ce326..43a4dbded119b 100644 --- a/executor/insert.go +++ b/executor/insert.go @@ -14,9 +14,9 @@ package executor import ( + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -129,15 +129,10 @@ func (e *InsertExec) batchUpdateDupRows(newRows [][]types.Datum) error { // Next implements Exec Next interface. func (e *InsertExec) Next(ctx context.Context, chk *chunk.Chunk) error { chk.Reset() - cols, err := e.getColumns(e.Table.Cols()) - if err != nil { - return errors.Trace(err) - } - if len(e.children) > 0 && e.children[0] != nil { - return errors.Trace(e.insertRowsFromSelect(ctx, cols, e.exec)) + return e.insertRowsFromSelect(ctx, e.exec) } - return errors.Trace(e.insertRows(cols, e.exec)) + return e.insertRows(e.exec) } // Close implements the Executor Close interface. @@ -154,6 +149,7 @@ func (e *InsertExec) Open(ctx context.Context) error { if e.SelectExec != nil { return e.SelectExec.Open(ctx) } + e.initEvalBuffer() return nil } diff --git a/executor/insert_common.go b/executor/insert_common.go index 2517420943feb..59655a57af6b1 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -16,11 +16,11 @@ package executor import ( "fmt" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -50,9 +50,13 @@ type InsertValues struct { GenColumns []*ast.ColumnName GenExprs []expression.Expression + insertColumns []*table.Column + // colDefaultVals is used to store casted default value. // Because not every insert statement needs colDefaultVals, so we will init the buffer lazily. - colDefaultVals []defaultVal + colDefaultVals []defaultVal + evalBuffer chunk.MutRow + evalBufferTypes []*types.FieldType } type defaultVal struct { @@ -61,16 +65,18 @@ type defaultVal struct { valid bool } -// getColumns gets the explicitly specified columns of an insert statement. There are three cases: +// initInsertColumns sets the explicitly specified columns of an insert statement. There are three cases: // There are three types of insert statements: // 1 insert ... values(...) --> name type column // 2 insert ... set x=y... --> set type column // 3 insert ... (select ..) --> name type column // See https://dev.mysql.com/doc/refman/5.7/en/insert.html -func (e *InsertValues) getColumns(tableCols []*table.Column) ([]*table.Column, error) { +func (e *InsertValues) initInsertColumns() error { var cols []*table.Column var err error + tableCols := e.Table.Cols() + if len(e.SetList) > 0 { // Process `set` type column. columns := make([]string, 0, len(e.SetList)) @@ -82,10 +88,10 @@ func (e *InsertValues) getColumns(tableCols []*table.Column) ([]*table.Column, e } cols, err = table.FindCols(tableCols, columns, e.Table.Meta().PKIsHandle) if err != nil { - return nil, errors.Errorf("INSERT INTO %s: %s", e.Table.Meta().Name.O, err) + return errors.Errorf("INSERT INTO %s: %s", e.Table.Meta().Name.O, err) } if len(cols) == 0 { - return nil, errors.Errorf("INSERT INTO %s: empty column", e.Table.Meta().Name.O) + return errors.Errorf("INSERT INTO %s: empty column", e.Table.Meta().Name.O) } } else if len(e.Columns) > 0 { // Process `name` type column. @@ -98,7 +104,7 @@ func (e *InsertValues) getColumns(tableCols []*table.Column) ([]*table.Column, e } cols, err = table.FindCols(tableCols, columns, e.Table.Meta().PKIsHandle) if err != nil { - return nil, errors.Errorf("INSERT INTO %s: %s", e.Table.Meta().Name.O, err) + return errors.Errorf("INSERT INTO %s: %s", e.Table.Meta().Name.O, err) } } else { // If e.Columns are empty, use all columns instead. @@ -114,10 +120,25 @@ func (e *InsertValues) getColumns(tableCols []*table.Column) ([]*table.Column, e // Check column whether is specified only once. err = table.CheckOnce(cols) if err != nil { - return nil, errors.Trace(err) + return err } + e.insertColumns = cols + return nil +} - return cols, nil +func (e *InsertValues) initEvalBuffer() { + numCols := len(e.Table.Cols()) + if e.hasExtraHandle { + numCols++ + } + e.evalBufferTypes = make([]*types.FieldType, numCols) + for i, col := range e.Table.Cols() { + e.evalBufferTypes[i] = &col.FieldType + } + if e.hasExtraHandle { + e.evalBufferTypes[len(e.evalBufferTypes)-1] = types.NewFieldType(mysql.TypeLonglong) + } + e.evalBuffer = chunk.MutRowFromTypes(e.evalBufferTypes) } func (e *InsertValues) lazilyInitColDefaultValBuf() (ok bool) { @@ -150,7 +171,7 @@ func (e *InsertValues) processSetList() error { } // insertRows processes `insert|replace into values ()` or `insert|replace into set x=y` -func (e *InsertValues) insertRows(cols []*table.Column, exec func(rows [][]types.Datum) error) (err error) { +func (e *InsertValues) insertRows(exec func(rows [][]types.Datum) error) (err error) { // For `insert|replace into set x=y`, process the set list here. if err = e.processSetList(); err != nil { return errors.Trace(err) @@ -159,7 +180,7 @@ func (e *InsertValues) insertRows(cols []*table.Column, exec func(rows [][]types rows := make([][]types.Datum, 0, len(e.Lists)) for i, list := range e.Lists { e.rowCount++ - row, err := e.evalRow(cols, list, i) + row, err := e.evalRow(list, i) if err != nil { return errors.Trace(err) } @@ -189,7 +210,7 @@ func (e *InsertValues) handleErr(col *table.Column, val *types.Datum, rowIdx int // evalRow evaluates a to-be-inserted row. The value of the column may base on another column, // so we use setValueForRefColumn to fill the empty row some default values when needFillDefaultValues is true. -func (e *InsertValues) evalRow(cols []*table.Column, list []expression.Expression, rowIdx int) ([]types.Datum, error) { +func (e *InsertValues) evalRow(list []expression.Expression, rowIdx int) ([]types.Datum, error) { rowLen := len(e.Table.Cols()) if e.hasExtraHandle { rowLen++ @@ -204,18 +225,20 @@ func (e *InsertValues) evalRow(cols []*table.Column, list []expression.Expressio } } + e.evalBuffer.SetDatums(row...) for i, expr := range list { - val, err := expr.Eval(chunk.MutRowFromDatums(row).ToRow()) - if err = e.handleErr(cols[i], &val, rowIdx, err); err != nil { + val, err := expr.Eval(e.evalBuffer.ToRow()) + if err = e.handleErr(e.insertColumns[i], &val, rowIdx, err); err != nil { return nil, errors.Trace(err) } - val1, err := table.CastValue(e.ctx, val, cols[i].ToInfo()) - if err = e.handleErr(cols[i], &val, rowIdx, err); err != nil { + val1, err := table.CastValue(e.ctx, val, e.insertColumns[i].ToInfo()) + if err = e.handleErr(e.insertColumns[i], &val, rowIdx, err); err != nil { return nil, errors.Trace(err) } - offset := cols[i].Offset - row[offset], hasValue[offset] = val1, true + offset := e.insertColumns[i].Offset + row[offset], hasValue[offset] = *val1.Copy(), true + e.evalBuffer.SetDatum(offset, val1) } return e.fillRow(row, hasValue) @@ -251,7 +274,7 @@ func (e *InsertValues) setValueForRefColumn(row []types.Datum, hasValue []bool) return nil } -func (e *InsertValues) insertRowsFromSelect(ctx context.Context, cols []*table.Column, exec func(rows [][]types.Datum) error) error { +func (e *InsertValues) insertRowsFromSelect(ctx context.Context, exec func(rows [][]types.Datum) error) error { // process `insert|replace into ... select ... from ...` selectExec := e.children[0] fields := selectExec.retTypes() @@ -275,7 +298,7 @@ func (e *InsertValues) insertRowsFromSelect(ctx context.Context, cols []*table.C for innerChunkRow := iter.Begin(); innerChunkRow != iter.End(); innerChunkRow = iter.Next() { innerRow := types.CopyRow(innerChunkRow.GetDatumRow(fields)) e.rowCount++ - row, err := e.getRow(cols, innerRow) + row, err := e.getRow(innerRow) if err != nil { return errors.Trace(err) } @@ -305,16 +328,16 @@ func (e *InsertValues) insertRowsFromSelect(ctx context.Context, cols []*table.C // getRow gets the row which from `insert into select from` or `load data`. // The input values from these two statements are datums instead of // expressions which are used in `insert into set x=y`. -func (e *InsertValues) getRow(cols []*table.Column, vals []types.Datum) ([]types.Datum, error) { +func (e *InsertValues) getRow(vals []types.Datum) ([]types.Datum, error) { row := make([]types.Datum, len(e.Table.Cols())) hasValue := make([]bool, len(e.Table.Cols())) for i, v := range vals { - casted, err := table.CastValue(e.ctx, v, cols[i].ToInfo()) + casted, err := table.CastValue(e.ctx, v, e.insertColumns[i].ToInfo()) if e.filterErr(err) != nil { return nil, errors.Trace(err) } - offset := cols[i].Offset + offset := e.insertColumns[i].Offset row[offset] = casted hasValue[offset] = true } @@ -516,7 +539,9 @@ func (e *InsertValues) batchCheckAndInsert(rows [][]types.Datum, addRecord func( } func (e *InsertValues) addRecord(row []types.Datum) (int64, error) { - e.ctx.Txn().SetOption(kv.PresumeKeyNotExists, nil) + if !e.ctx.GetSessionVars().ConstraintCheckInPlace { + e.ctx.Txn().SetOption(kv.PresumeKeyNotExists, nil) + } h, err := e.Table.AddRecord(e.ctx, row, false) e.ctx.Txn().DelOption(kv.PresumeKeyNotExists) if err != nil { diff --git a/executor/insert_test.go b/executor/insert_test.go index 38bd7b2ad1a1b..ef379bd4868c2 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -15,8 +15,8 @@ package executor_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/testkit" ) diff --git a/executor/join.go b/executor/join.go index c8bb23a47f9f1..c62d73ab65e95 100644 --- a/executor/join.go +++ b/executor/join.go @@ -20,9 +20,9 @@ import ( "time" "unsafe" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" plannercore "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" @@ -509,9 +509,9 @@ func (e *HashJoinExec) join2Chunk(workerID uint, outerChk *chunk.Chunk, joinResu // step 1. fetch data from inner child and build a hash table; // step 2. fetch data from outer child in a background goroutine and probe the hash table in multiple join workers. func (e *HashJoinExec) Next(ctx context.Context, chk *chunk.Chunk) (err error) { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } if !e.prepared { e.innerFinished = make(chan error, 1) @@ -726,9 +726,9 @@ func (e *NestedLoopApplyExec) fetchAllInners(ctx context.Context) error { // Next implements the Executor interface. func (e *NestedLoopApplyExec) Next(ctx context.Context, chk *chunk.Chunk) (err error) { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() for { diff --git a/executor/join_test.go b/executor/join_test.go index e79758db5ef96..8b4c37e654f6b 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -876,11 +876,11 @@ func (s *testSuite) TestMergejoinOrder(c *C) { tk.MustExec("insert into t2 select a*100, b*100 from t1;") tk.MustQuery("explain select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a;").Check(testkit.Rows( - "MergeJoin_15 12500.00 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)]", + "MergeJoin_15 10000.00 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)]", "├─TableReader_11 10000.00 root data:TableScan_10", "│ └─TableScan_10 10000.00 cop table:t1, range:[-inf,+inf], keep order:true, stats:pseudo", - "└─TableReader_13 10000.00 root data:TableScan_12", - " └─TableScan_12 10000.00 cop table:t2, range:[-inf,+inf], keep order:true, stats:pseudo", + "└─TableReader_13 6666.67 root data:TableScan_12", + " └─TableScan_12 6666.67 cop table:t2, range:[-inf,3), (3,+inf], keep order:true, stats:pseudo", )) tk.MustExec("set @@tidb_max_chunk_size=1") diff --git a/executor/load_data.go b/executor/load_data.go index d6ee3724a3a74..6ab6c7aa5050c 100644 --- a/executor/load_data.go +++ b/executor/load_data.go @@ -18,7 +18,7 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" @@ -44,7 +44,6 @@ func NewLoadDataInfo(ctx sessionctx.Context, row []types.Datum, tbl table.Table, InsertValues: insertVal, Table: tbl, Ctx: ctx, - columns: cols, } } @@ -81,6 +80,9 @@ func (e *LoadDataExec) Close() error { // Open implements the Executor Open interface. func (e *LoadDataExec) Open(ctx context.Context) error { + if e.loadDataInfo.insertColumns != nil { + e.loadDataInfo.initEvalBuffer() + } return nil } @@ -95,7 +97,6 @@ type LoadDataInfo struct { LinesInfo *ast.LinesClause IgnoreLines uint64 Ctx sessionctx.Context - columns []*table.Column } // SetMaxRowsInBatch sets the max number of rows to insert in a batch. @@ -274,7 +275,7 @@ func (e *LoadDataInfo) colsToRow(cols []field) []types.Datum { e.row[i].SetString(string(cols[i].str)) } } - row, err := e.getRow(e.columns, e.row) + row, err := e.getRow(e.row) if err != nil { e.handleWarning(err, fmt.Sprintf("Load Data: insert data:%v failed:%v", e.row, errors.ErrorStack(err))) diff --git a/executor/merge_join.go b/executor/merge_join.go index e89c965621b2b..4bbfeaac26e0d 100644 --- a/executor/merge_join.go +++ b/executor/merge_join.go @@ -263,9 +263,9 @@ func (e *MergeJoinExec) prepare(ctx context.Context, chk *chunk.Chunk) error { // Next implements the Executor Next interface. func (e *MergeJoinExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if !e.prepared { diff --git a/executor/metrics_test.go b/executor/metrics_test.go index 13a17a619701e..8bc0207c21088 100644 --- a/executor/metrics_test.go +++ b/executor/metrics_test.go @@ -17,8 +17,8 @@ import ( "fmt" . "github.com/pingcap/check" + "github.com/pingcap/parser" "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/planner" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" diff --git a/executor/pkg_test.go b/executor/pkg_test.go index e75e5fade8a55..7a6a6cbd6b02d 100644 --- a/executor/pkg_test.go +++ b/executor/pkg_test.go @@ -4,9 +4,9 @@ import ( "fmt" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -110,3 +110,33 @@ func (s *pkgTestSuite) TestNestedLoopApply(c *C) { } } } + +func (s *pkgTestSuite) TestMoveInfoSchemaToFront(c *C) { + dbss := [][]string{ + {}, + {"A", "B", "C", "a", "b", "c"}, + {"A", "B", "C", "INFORMATION_SCHEMA"}, + {"A", "B", "INFORMATION_SCHEMA", "a"}, + {"INFORMATION_SCHEMA"}, + {"A", "B", "C", "INFORMATION_SCHEMA", "a", "b"}, + } + wanted := [][]string{ + {}, + {"A", "B", "C", "a", "b", "c"}, + {"INFORMATION_SCHEMA", "A", "B", "C"}, + {"INFORMATION_SCHEMA", "A", "B", "a"}, + {"INFORMATION_SCHEMA"}, + {"INFORMATION_SCHEMA", "A", "B", "C", "a", "b"}, + } + + for _, dbs := range dbss { + moveInfoSchemaToFront(dbs) + } + + for i, dbs := range wanted { + c.Check(len(dbss[i]), Equals, len(dbs)) + for j, db := range dbs { + c.Check(dbss[i][j], Equals, db) + } + } +} diff --git a/executor/point_get.go b/executor/point_get.go index cd150178843da..e74c29e8aafbb 100644 --- a/executor/point_get.go +++ b/executor/point_get.go @@ -14,10 +14,10 @@ package executor import ( + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" @@ -135,40 +135,60 @@ func (e *PointGetExecutor) get(key kv.Key) (val []byte, err error) { } func (e *PointGetExecutor) decodeRowValToChunk(rowVal []byte, chk *chunk.Chunk) error { - colIDs := make(map[int64]int, e.schema.Len()) - for i, col := range e.schema.Columns { - colIDs[col.ID] = i + // One column could be filled for multi-times in the schema. e.g. select b, b, c, c from t where a = 1. + // We need to set the positions in the schema for the same column. + colID2DecodedPos := make(map[int64]int, e.schema.Len()) + decodedPos2SchemaPos := make([][]int, 0, e.schema.Len()) + for schemaPos, col := range e.schema.Columns { + if decodedPos, ok := colID2DecodedPos[col.ID]; !ok { + colID2DecodedPos[col.ID] = len(colID2DecodedPos) + decodedPos2SchemaPos = append(decodedPos2SchemaPos, []int{schemaPos}) + } else { + decodedPos2SchemaPos[decodedPos] = append(decodedPos2SchemaPos[decodedPos], schemaPos) + } } - colVals, err := tablecodec.CutRowNew(rowVal, colIDs) + decodedVals, err := tablecodec.CutRowNew(rowVal, colID2DecodedPos) if err != nil { return errors.Trace(err) } - if colVals == nil { - colVals = make([][]byte, len(colIDs)) + if decodedVals == nil { + decodedVals = make([][]byte, len(colID2DecodedPos)) } decoder := codec.NewDecoder(chk, e.ctx.GetSessionVars().Location()) - for id, offset := range colIDs { - if e.tblInfo.PKIsHandle && mysql.HasPriKeyFlag(e.schema.Columns[offset].RetType.Flag) { - chk.AppendInt64(offset, e.handle) + for id, decodedPos := range colID2DecodedPos { + schemaPoses := decodedPos2SchemaPos[decodedPos] + firstPos := schemaPoses[0] + if e.tblInfo.PKIsHandle && mysql.HasPriKeyFlag(e.schema.Columns[firstPos].RetType.Flag) { + chk.AppendInt64(firstPos, e.handle) + // Fill other positions. + for i := 1; i < len(schemaPoses); i++ { + chk.MakeRef(firstPos, schemaPoses[i]) + } continue } + // ExtraHandleID is added when building plan, we can make sure that there's only one column's ID is this. if id == model.ExtraHandleID { - chk.AppendInt64(offset, e.handle) + chk.AppendInt64(firstPos, e.handle) continue } - if len(colVals[offset]) == 0 { + if len(decodedVals[decodedPos]) == 0 { + // This branch only entered for updating and deleting. It won't have one column in multiple positions. colInfo := getColInfoByID(e.tblInfo, id) d, err1 := table.GetColOriginDefaultValue(e.ctx, colInfo) if err1 != nil { return errors.Trace(err1) } - chk.AppendDatum(offset, &d) + chk.AppendDatum(firstPos, &d) continue } - _, err = decoder.DecodeOne(colVals[offset], offset, e.schema.Columns[offset].RetType) + _, err = decoder.DecodeOne(decodedVals[decodedPos], firstPos, e.schema.Columns[firstPos].RetType) if err != nil { return errors.Trace(err) } + // Fill other positions. + for i := 1; i < len(schemaPoses); i++ { + chk.MakeRef(firstPos, schemaPoses[i]) + } } return nil } diff --git a/executor/point_get_test.go b/executor/point_get_test.go index 5d0716618c850..65f8786ea7f71 100644 --- a/executor/point_get_test.go +++ b/executor/point_get_test.go @@ -38,7 +38,7 @@ func (s *testSuite) TestPointGet(c *C) { tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a bigint primary key, b bigint, c bigint);`) - tk.MustExec(`insert into t values(1, NULL, NULL), (2, NULL, 2), (3, 3, NULL), (4, 4, 4);`) + tk.MustExec(`insert into t values(1, NULL, NULL), (2, NULL, 2), (3, 3, NULL), (4, 4, 4), (5, 6, 7);`) tk.MustQuery(`select * from t where a = 1;`).Check(testkit.Rows( `1 `, )) @@ -51,4 +51,7 @@ func (s *testSuite) TestPointGet(c *C) { tk.MustQuery(`select * from t where a = 4;`).Check(testkit.Rows( `4 4 4`, )) + tk.MustQuery(`select a, a, b, a, b, c, b, c, c from t where a = 5;`).Check(testkit.Rows( + `5 5 6 5 6 7 6 7 7`, + )) } diff --git a/executor/prepared.go b/executor/prepared.go index a006bf0d6edd3..2c3f97361b1f6 100644 --- a/executor/prepared.go +++ b/executor/prepared.go @@ -17,15 +17,16 @@ import ( "math" "sort" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/planner" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" @@ -39,7 +40,7 @@ var ( ) type paramMarkerSorter struct { - markers []*ast.ParamMarkerExpr + markers []ast.ParamMarkerExpr } func (p *paramMarkerSorter) Len() int { @@ -47,7 +48,7 @@ func (p *paramMarkerSorter) Len() int { } func (p *paramMarkerSorter) Less(i, j int) bool { - return p.markers[i].Offset < p.markers[j].Offset + return p.markers[i].(*driver.ParamMarkerExpr).Offset < p.markers[j].(*driver.ParamMarkerExpr).Offset } func (p *paramMarkerSorter) Swap(i, j int) { @@ -55,7 +56,7 @@ func (p *paramMarkerSorter) Swap(i, j int) { } type paramMarkerExtractor struct { - markers []*ast.ParamMarkerExpr + markers []ast.ParamMarkerExpr } func (e *paramMarkerExtractor) Enter(in ast.Node) (ast.Node, bool) { @@ -63,7 +64,7 @@ func (e *paramMarkerExtractor) Enter(in ast.Node) (ast.Node, bool) { } func (e *paramMarkerExtractor) Leave(in ast.Node) (ast.Node, bool) { - if x, ok := in.(*ast.ParamMarkerExpr); ok { + if x, ok := in.(*driver.ParamMarkerExpr); ok { e.markers = append(e.markers, x) } return in, true @@ -145,7 +146,7 @@ func (e *PrepareExec) Next(ctx context.Context, chk *chunk.Chunk) error { sort.Sort(sorter) e.ParamCount = len(sorter.markers) for i := 0; i < e.ParamCount; i++ { - sorter.markers[i].Order = i + sorter.markers[i].SetOrder(i) } prepared := &ast.Prepared{ Stmt: stmt, @@ -156,7 +157,7 @@ func (e *PrepareExec) Next(ctx context.Context, chk *chunk.Chunk) error { // We try to build the real statement of preparedStmt. for i := range prepared.Params { - prepared.Params[i].SetDatum(types.NewIntDatum(0)) + prepared.Params[i].(*driver.ParamMarkerExpr).Datum = types.NewIntDatum(0) } var p plannercore.Plan p, err = plannercore.BuildLogicalPlan(e.ctx, stmt, e.is) @@ -239,7 +240,7 @@ func (e *DeallocateExec) Next(ctx context.Context, chk *chunk.Chunk) error { } // CompileExecutePreparedStmt compiles a session Execute command to a stmt.Statement. -func CompileExecutePreparedStmt(ctx sessionctx.Context, ID uint32, args ...interface{}) (ast.Statement, error) { +func CompileExecutePreparedStmt(ctx sessionctx.Context, ID uint32, args ...interface{}) (sqlexec.Statement, error) { execStmt := &ast.ExecuteStmt{ExecID: ID} if err := ResetContextOfStmt(ctx, execStmt); err != nil { return nil, err diff --git a/executor/prepared_test.go b/executor/prepared_test.go index 3e19ca79b9e95..8ee067bb15424 100644 --- a/executor/prepared_test.go +++ b/executor/prepared_test.go @@ -18,9 +18,9 @@ import ( "strings" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/executor" plannercore "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/testkit" "github.com/pkg/errors" "golang.org/x/net/context" @@ -322,3 +322,46 @@ func generateBatchSQL(paramCount int) (sql string, paramSlice []interface{}) { } return "insert into t values " + strings.Join(placeholders, ","), params } + +func (s *testSuite) TestPreparedIssue7579(c *C) { + orgEnable := plannercore.PreparedPlanCacheEnabled() + orgCapacity := plannercore.PreparedPlanCacheCapacity + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + plannercore.PreparedPlanCacheCapacity = orgCapacity + }() + flags := []bool{false, true} + for _, flag := range flags { + plannercore.SetPreparedPlanCache(flag) + plannercore.PreparedPlanCacheCapacity = 100 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, index a_idx(a))") + tk.MustExec("insert into t values (1,1), (2,2), (null,3)") + + r := tk.MustQuery("select a, b from t order by b asc;") + r.Check(testkit.Rows("1 1", "2 2", " 3")) + + tk.MustExec(`prepare stmt from 'select a, b from t where ? order by b asc'`) + + r = tk.MustQuery(`execute stmt using @param;`) + r.Check(nil) + + tk.MustExec(`set @param = true`) + r = tk.MustQuery(`execute stmt using @param;`) + r.Check(testkit.Rows("1 1", "2 2", " 3")) + + tk.MustExec(`set @param = false`) + r = tk.MustQuery(`execute stmt using @param;`) + r.Check(nil) + + tk.MustExec(`set @param = 1`) + r = tk.MustQuery(`execute stmt using @param;`) + r.Check(testkit.Rows("1 1", "2 2", " 3")) + + tk.MustExec(`set @param = 0`) + r = tk.MustQuery(`execute stmt using @param;`) + r.Check(nil) + } +} diff --git a/executor/projection.go b/executor/projection.go index a4cabf30547f2..dce2709f1271b 100644 --- a/executor/projection.go +++ b/executor/projection.go @@ -141,9 +141,9 @@ func (e *ProjectionExec) Open(ctx context.Context) error { // +------------------------------+ +----------------------+ // func (e *ProjectionExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.GrowAndReset(e.maxChunkSize) if e.isUnparallelExec() { diff --git a/executor/replace.go b/executor/replace.go index dbe79cfde4817..bb06f2fec0455 100644 --- a/executor/replace.go +++ b/executor/replace.go @@ -42,6 +42,7 @@ func (e *ReplaceExec) Open(ctx context.Context) error { if e.SelectExec != nil { return e.SelectExec.Open(ctx) } + e.initEvalBuffer() return nil } @@ -178,13 +179,8 @@ func (e *ReplaceExec) exec(newRows [][]types.Datum) error { // Next implements the Executor Next interface. func (e *ReplaceExec) Next(ctx context.Context, chk *chunk.Chunk) error { chk.Reset() - cols, err := e.getColumns(e.Table.Cols()) - if err != nil { - return errors.Trace(err) - } - if len(e.children) > 0 && e.children[0] != nil { - return errors.Trace(e.insertRowsFromSelect(ctx, cols, e.exec)) + return e.insertRowsFromSelect(ctx, e.exec) } - return errors.Trace(e.insertRows(cols, e.exec)) + return e.insertRows(e.exec) } diff --git a/executor/revoke.go b/executor/revoke.go index 3f2edb6c7249b..35992f885615f 100644 --- a/executor/revoke.go +++ b/executor/revoke.go @@ -16,10 +16,10 @@ package executor import ( "fmt" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util/chunk" diff --git a/executor/revoke_test.go b/executor/revoke_test.go index cc3025f7a55e5..de194356b0a95 100644 --- a/executor/revoke_test.go +++ b/executor/revoke_test.go @@ -18,7 +18,7 @@ import ( "strings" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/util/testkit" ) diff --git a/executor/set.go b/executor/set.go index 76562a6a4f8f9..f7f7853c8717c 100644 --- a/executor/set.go +++ b/executor/set.go @@ -18,14 +18,14 @@ import ( "strings" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" diff --git a/executor/set_test.go b/executor/set_test.go index 147bc22d16636..529bd74a5d178 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -15,9 +15,9 @@ package executor_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" "golang.org/x/net/context" @@ -234,6 +234,11 @@ func (s *testSuite) TestSetVar(c *C) { tk.MustQuery(`select @@tidb_force_priority;`).Check(testkit.Rows("NO_PRIORITY")) _, err = tk.Exec(`set global tidb_force_priority = ""`) c.Assert(err, NotNil) + + tk.MustExec("set tidb_constraint_check_in_place = 1") + tk.MustQuery(`select @@session.tidb_constraint_check_in_place;`).Check(testkit.Rows("1")) + tk.MustExec("set global tidb_constraint_check_in_place = 0") + tk.MustQuery(`select @@global.tidb_constraint_check_in_place;`).Check(testkit.Rows("0")) } func (s *testSuite) TestSetCharset(c *C) { diff --git a/executor/show.go b/executor/show.go index 0a76e27f683f7..a959a30aa9457 100644 --- a/executor/show.go +++ b/executor/show.go @@ -22,19 +22,19 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/ast" + "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/terror" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/auth" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/format" "github.com/pkg/errors" @@ -166,11 +166,25 @@ func (e *ShowExec) fetchShowEngines() error { return nil } +// moveInfoSchemaToFront moves information_schema to the first, and the others are sorted in the origin ascending order. +func moveInfoSchemaToFront(dbs []string) { + if len(dbs) > 0 && strings.EqualFold(dbs[0], "INFORMATION_SCHEMA") { + return + } + + i := sort.SearchStrings(dbs, "INFORMATION_SCHEMA") + if i < len(dbs) && strings.EqualFold(dbs[i], "INFORMATION_SCHEMA") { + copy(dbs[1:i+1], dbs[0:i]) + dbs[0] = "INFORMATION_SCHEMA" + } +} + func (e *ShowExec) fetchShowDatabases() error { dbs := e.is.AllSchemaNames() checker := privilege.GetPrivilegeManager(e.ctx) - // TODO: let information_schema be the first database sort.Strings(dbs) + // let information_schema be the first database + moveInfoSchemaToFront(dbs) for _, d := range dbs { if checker != nil && !checker.DBIsVisible(d) { continue diff --git a/executor/show_stats.go b/executor/show_stats.go index 6c8c4f0ddc258..c221df9ba31d9 100644 --- a/executor/show_stats.go +++ b/executor/show_stats.go @@ -16,8 +16,8 @@ package executor import ( "time" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/types" @@ -30,34 +30,45 @@ func (e *ShowExec) fetchShowStatsMeta() error { dbs := do.InfoSchema().AllSchemas() for _, db := range dbs { for _, tbl := range db.Tables { - statsTbl := h.GetTableStats(tbl) - if !statsTbl.Pseudo { - e.appendRow([]interface{}{ - db.Name.O, - tbl.Name.O, - e.versionToTime(statsTbl.Version), - statsTbl.ModifyCount, - statsTbl.Count, - }) + pi := tbl.GetPartitionInfo() + if pi == nil { + e.appendTableForStatsMeta(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + } else { + for _, def := range pi.Definitions { + e.appendTableForStatsMeta(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) + } } } } return nil } +func (e *ShowExec) appendTableForStatsMeta(dbName, tblName, partitionName string, statsTbl *statistics.Table) { + if statsTbl.Pseudo { + return + } + e.appendRow([]interface{}{ + dbName, + tblName, + partitionName, + e.versionToTime(statsTbl.Version), + statsTbl.ModifyCount, + statsTbl.Count, + }) +} + func (e *ShowExec) fetchShowStatsHistogram() error { do := domain.GetDomain(e.ctx) h := do.StatsHandle() dbs := do.InfoSchema().AllSchemas() for _, db := range dbs { for _, tbl := range db.Tables { - statsTbl := h.GetTableStats(tbl) - if !statsTbl.Pseudo { - for _, col := range statsTbl.Columns { - e.histogramToRow(db.Name.O, tbl.Name.O, col.Info.Name.O, 0, col.Histogram, col.AvgColSize(statsTbl.Count)) - } - for _, idx := range statsTbl.Indices { - e.histogramToRow(db.Name.O, tbl.Name.O, idx.Info.Name.O, 1, idx.Histogram, 0) + pi := tbl.GetPartitionInfo() + if pi == nil { + e.appendTableForStatsHistograms(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + } else { + for _, def := range pi.Definitions { + e.appendTableForStatsHistograms(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) } } } @@ -65,10 +76,23 @@ func (e *ShowExec) fetchShowStatsHistogram() error { return nil } -func (e *ShowExec) histogramToRow(dbName string, tblName string, colName string, isIndex int, hist statistics.Histogram, avgColSize float64) { +func (e *ShowExec) appendTableForStatsHistograms(dbName, tblName, partitionName string, statsTbl *statistics.Table) { + if statsTbl.Pseudo { + return + } + for _, col := range statsTbl.Columns { + e.histogramToRow(dbName, tblName, partitionName, col.Info.Name.O, 0, col.Histogram, col.AvgColSize(statsTbl.Count)) + } + for _, idx := range statsTbl.Indices { + e.histogramToRow(dbName, tblName, partitionName, idx.Info.Name.O, 1, idx.Histogram, 0) + } +} + +func (e *ShowExec) histogramToRow(dbName, tblName, partitionName, colName string, isIndex int, hist statistics.Histogram, avgColSize float64) { e.appendRow([]interface{}{ dbName, tblName, + partitionName, colName, isIndex, e.versionToTime(hist.LastUpdateVersion), @@ -89,19 +113,12 @@ func (e *ShowExec) fetchShowStatsBuckets() error { dbs := do.InfoSchema().AllSchemas() for _, db := range dbs { for _, tbl := range db.Tables { - statsTbl := h.GetTableStats(tbl) - if !statsTbl.Pseudo { - for _, col := range statsTbl.Columns { - err := e.bucketsToRows(db.Name.O, tbl.Name.O, col.Info.Name.O, 0, col.Histogram) - if err != nil { - return errors.Trace(err) - } - } - for _, idx := range statsTbl.Indices { - err := e.bucketsToRows(db.Name.O, tbl.Name.O, idx.Info.Name.O, len(idx.Info.Columns), idx.Histogram) - if err != nil { - return errors.Trace(err) - } + pi := tbl.GetPartitionInfo() + if pi == nil { + e.appendTableForStatsBuckets(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + } else { + for _, def := range pi.Definitions { + e.appendTableForStatsBuckets(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) } } } @@ -109,9 +126,28 @@ func (e *ShowExec) fetchShowStatsBuckets() error { return nil } +func (e *ShowExec) appendTableForStatsBuckets(dbName, tblName, partitionName string, statsTbl *statistics.Table) error { + if statsTbl.Pseudo { + return nil + } + for _, col := range statsTbl.Columns { + err := e.bucketsToRows(dbName, tblName, partitionName, col.Info.Name.O, 0, col.Histogram) + if err != nil { + return errors.Trace(err) + } + } + for _, idx := range statsTbl.Indices { + err := e.bucketsToRows(dbName, tblName, partitionName, idx.Info.Name.O, len(idx.Info.Columns), idx.Histogram) + if err != nil { + return errors.Trace(err) + } + } + return nil +} + // bucketsToRows converts histogram buckets to rows. If the histogram is built from index, then numOfCols equals to number // of index columns, else numOfCols is 0. -func (e *ShowExec) bucketsToRows(dbName, tblName, colName string, numOfCols int, hist statistics.Histogram) error { +func (e *ShowExec) bucketsToRows(dbName, tblName, partitionName, colName string, numOfCols int, hist statistics.Histogram) error { isIndex := 0 if numOfCols > 0 { isIndex = 1 @@ -128,6 +164,7 @@ func (e *ShowExec) bucketsToRows(dbName, tblName, colName string, numOfCols int, e.appendRow([]interface{}{ dbName, tblName, + partitionName, colName, isIndex, i, @@ -146,20 +183,32 @@ func (e *ShowExec) fetchShowStatsHealthy() { dbs := do.InfoSchema().AllSchemas() for _, db := range dbs { for _, tbl := range db.Tables { - statsTbl := h.GetTableStats(tbl) - if !statsTbl.Pseudo { - var healthy int64 - if statsTbl.ModifyCount < statsTbl.Count { - healthy = int64((1.0 - float64(statsTbl.ModifyCount)/float64(statsTbl.Count)) * 100.0) - } else if statsTbl.ModifyCount == 0 { - healthy = 100 + pi := tbl.GetPartitionInfo() + if pi == nil { + e.appendTableForStatsHealthy(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + } else { + for _, def := range pi.Definitions { + e.appendTableForStatsHealthy(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) } - e.appendRow([]interface{}{ - db.Name.O, - tbl.Name.O, - healthy, - }) } } } } + +func (e *ShowExec) appendTableForStatsHealthy(dbName, tblName, partitionName string, statsTbl *statistics.Table) { + if statsTbl.Pseudo { + return + } + var healthy int64 + if statsTbl.ModifyCount < statsTbl.Count { + healthy = int64((1.0 - float64(statsTbl.ModifyCount)/float64(statsTbl.Count)) * 100.0) + } else if statsTbl.ModifyCount == 0 { + healthy = 100 + } + e.appendRow([]interface{}{ + dbName, + tblName, + partitionName, + healthy, + }) +} diff --git a/executor/show_stats_test.go b/executor/show_stats_test.go index 03ddf989095f4..c0cc6e70f7cd1 100644 --- a/executor/show_stats_test.go +++ b/executor/show_stats_test.go @@ -44,11 +44,11 @@ func (s *testSuite) TestShowStatsHistograms(c *C) { tk.MustExec("analyze table t") result := tk.MustQuery("show stats_histograms").Sort() c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[0][2], Equals, "a") - c.Assert(result.Rows()[1][2], Equals, "b") + c.Assert(result.Rows()[0][3], Equals, "a") + c.Assert(result.Rows()[1][3], Equals, "b") result = tk.MustQuery("show stats_histograms where column_name = 'a'") c.Assert(len(result.Rows()), Equals, 1) - c.Assert(result.Rows()[0][2], Equals, "a") + c.Assert(result.Rows()[0][3], Equals, "a") } func (s *testSuite) TestShowStatsBuckets(c *C) { @@ -60,9 +60,9 @@ func (s *testSuite) TestShowStatsBuckets(c *C) { tk.MustExec("insert into t values (1,1)") tk.MustExec("analyze table t") result := tk.MustQuery("show stats_buckets").Sort() - result.Sort().Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t b 0 0 1 1 1 1", "test t idx 1 0 1 1 (1, 1) (1, 1)")) + result.Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t b 0 0 1 1 1 1", "test t idx 1 0 1 1 (1, 1) (1, 1)")) result = tk.MustQuery("show stats_buckets where column_name = 'idx'") - result.Check(testkit.Rows("test t idx 1 0 1 1 (1, 1) (1, 1)")) + result.Check(testkit.Rows("test t idx 1 0 1 1 (1, 1) (1, 1)")) } func (s *testSuite) TestShowStatsHealthy(c *C) { @@ -72,22 +72,22 @@ func (s *testSuite) TestShowStatsHealthy(c *C) { tk.MustExec("create table t (a int)") tk.MustExec("create index idx on t(a)") tk.MustExec("analyze table t") - tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) + tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("insert into t values (1), (2)") do, _ := session.GetDomain(s.store) do.StatsHandle().DumpStatsDeltaToKV(statistics.DumpAll) tk.MustExec("analyze table t") - tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) + tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("insert into t values (3), (4), (5), (6), (7), (8), (9), (10)") do.StatsHandle().DumpStatsDeltaToKV(statistics.DumpAll) do.StatsHandle().Update(do.InfoSchema()) - tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 19")) + tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 19")) tk.MustExec("analyze table t") - tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) + tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("delete from t") do.StatsHandle().DumpStatsDeltaToKV(statistics.DumpAll) do.StatsHandle().Update(do.InfoSchema()) - tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 0")) + tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 0")) } func (s *testSuite) TestShowStatsHasNullValue(c *C) { @@ -96,5 +96,36 @@ func (s *testSuite) TestShowStatsHasNullValue(c *C) { tk.MustExec("create table t (a int, index idx(a))") tk.MustExec("insert into t values(NULL)") tk.MustExec("analyze table t") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t idx 1 0 1 1 NULL NULL")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t idx 1 0 1 1 NULL NULL")) +} + +func (s *testSuite) TestShowPartitionStats(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@session.tidb_enable_table_partition=1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) + PARTITION BY RANGE ( a ) (PARTITION p0 VALUES LESS THAN (6))` + tk.MustExec(createTable) + tk.MustExec(`insert into t values (1, 1)`) + tk.MustExec("analyze table t") + + result := tk.MustQuery("show stats_meta") + c.Assert(len(result.Rows()), Equals, 1) + c.Assert(result.Rows()[0][0], Equals, "test") + c.Assert(result.Rows()[0][1], Equals, "t") + c.Assert(result.Rows()[0][2], Equals, "p0") + + result = tk.MustQuery("show stats_histograms").Sort() + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(result.Rows()[0][2], Equals, "p0") + c.Assert(result.Rows()[0][3], Equals, "a") + c.Assert(result.Rows()[1][2], Equals, "p0") + c.Assert(result.Rows()[1][3], Equals, "idx") + + result = tk.MustQuery("show stats_buckets").Sort() + result.Check(testkit.Rows("test t p0 a 0 0 1 1 1 1", "test t p0 idx 1 0 1 1 1 1")) + + result = tk.MustQuery("show stats_healthy") + result.Check(testkit.Rows("test t p0 100")) } diff --git a/executor/show_test.go b/executor/show_test.go index cf1bbfef8e8de..abad27b13134a 100644 --- a/executor/show_test.go +++ b/executor/show_test.go @@ -19,15 +19,15 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" "github.com/pkg/errors" @@ -462,6 +462,30 @@ func (s *testSuite) TestShowVisibility(c *C) { tk.MustExec("drop database showdatabase") } +func (s *testSuite) TestShowDatabasesInfoSchemaFirst(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery("show databases").Check(testkit.Rows("INFORMATION_SCHEMA")) + tk.MustExec(`create user 'show'@'%'`) + tk.MustExec(`flush privileges`) + + tk.MustExec(`create database AAAA`) + tk.MustExec(`create database BBBB`) + tk.MustExec(`grant select on AAAA.* to 'show'@'%'`) + tk.MustExec(`grant select on BBBB.* to 'show'@'%'`) + tk.MustExec(`flush privileges`) + + tk1 := testkit.NewTestKit(c, s.store) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + c.Assert(se.Auth(&auth.UserIdentity{Username: "show", Hostname: "%"}, nil, nil), IsTrue) + tk1.Se = se + tk1.MustQuery("show databases").Check(testkit.Rows("INFORMATION_SCHEMA", "AAAA", "BBBB")) + + tk.MustExec(`drop user 'show'@'%'`) + tk.MustExec(`drop database AAAA`) + tk.MustExec(`drop database BBBB`) +} + // mockSessionManager is a mocked session manager that wraps one session // it returns only this session's current process info as processlist for test. type mockSessionManager struct { @@ -631,6 +655,25 @@ func (s *testSuite) TestShowTableStatus(c *C) { c.Assert(rows[0].GetString(16), Equals, "partitioned") } +func (s *testSuite) TestShowTableStatusCaseInsensitive(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 bigint);`) + + // It's not easy to test the result contents because every time the test runs, "Create_time" changed. + rs, err := tk.Exec("SHOW TABLE STATUS like 'T';") + c.Assert(errors.ErrorStack(err), Equals, "") + c.Assert(rs, NotNil) + rows, err := session.GetRows4Test(context.Background(), tk.Se, rs) + c.Assert(errors.ErrorStack(err), Equals, "") + err = rs.Close() + c.Assert(errors.ErrorStack(err), Equals, "") + + c.Assert(rows[0].GetString(0), Equals, "t") +} + func (s *testSuite) TestShowSlow(c *C) { tk := testkit.NewTestKit(c, s.store) // The test result is volatile, because diff --git a/executor/simple.go b/executor/simple.go index e05f20012260d..849c874a3d40b 100644 --- a/executor/simple.go +++ b/executor/simple.go @@ -17,16 +17,16 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" diff --git a/executor/simple_test.go b/executor/simple_test.go index c0a14e4e13c52..0564f01bc6f87 100644 --- a/executor/simple_test.go +++ b/executor/simple_test.go @@ -15,14 +15,14 @@ package executor_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/testkit" "golang.org/x/net/context" ) diff --git a/executor/sort.go b/executor/sort.go index d9f0ef9381c39..6dcb74361d8d9 100644 --- a/executor/sort.go +++ b/executor/sort.go @@ -74,9 +74,9 @@ func (e *SortExec) Open(ctx context.Context) error { // Next implements the Executor Next interface. func (e *SortExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if !e.fetched { @@ -227,7 +227,7 @@ func (e *SortExec) keyChunksLess(i, j int) bool { type TopNExec struct { SortExec limit *plannercore.PhysicalLimit - totalLimit int + totalLimit uint64 chkHeap *topNChunkHeap } @@ -301,13 +301,13 @@ func (e *TopNExec) Open(ctx context.Context) error { // Next implements the Executor Next interface. func (e *TopNExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.Reset() if !e.fetched { - e.totalLimit = int(e.limit.Offset + e.limit.Count) + e.totalLimit = e.limit.Offset + e.limit.Count e.Idx = int(e.limit.Offset) err := e.loadChunksUntilTotalLimit(ctx) if err != nil { @@ -335,7 +335,7 @@ func (e *TopNExec) loadChunksUntilTotalLimit(ctx context.Context) error { e.rowChunks = chunk.NewList(e.retTypes(), e.initCap, e.maxChunkSize) e.rowChunks.GetMemTracker().AttachTo(e.memTracker) e.rowChunks.GetMemTracker().SetLabel("rowChunks") - for e.rowChunks.Len() < e.totalLimit { + for uint64(e.rowChunks.Len()) < e.totalLimit { srcChk := e.children[0].newFirstChunk() err := e.children[0].Next(ctx, srcChk) if err != nil { @@ -363,7 +363,7 @@ const topNCompactionFactor = 4 func (e *TopNExec) executeTopN(ctx context.Context) error { heap.Init(e.chkHeap) - for len(e.rowPtrs) > e.totalLimit { + for uint64(len(e.rowPtrs)) > e.totalLimit { // The number of rows we loaded may exceeds total limit, remove greatest rows by Pop. heap.Pop(e.chkHeap) } diff --git a/executor/statement_context_test.go b/executor/statement_context_test.go index 5808488fed575..df7d86d4115a8 100644 --- a/executor/statement_context_test.go +++ b/executor/statement_context_test.go @@ -18,8 +18,8 @@ import ( "unicode/utf8" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/testkit" ) diff --git a/executor/table_reader.go b/executor/table_reader.go index a2b27848bd350..3c81d402d141c 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -16,8 +16,8 @@ package executor import ( "time" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/distsql" - "github.com/pingcap/tidb/model" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" @@ -100,9 +100,9 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error { // Next fills data into the chunk passed by its caller. // The task was actually done by tableReaderHandler. func (e *TableReaderExecutor) Next(ctx context.Context, chk *chunk.Chunk) error { - if e.runtimeStat != nil { + if e.runtimeStats != nil { start := time.Now() - defer func() { e.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { e.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } if err := e.resultHandler.nextChunk(ctx, chk); err != nil { e.feedback.Invalidate() diff --git a/executor/trace.go b/executor/trace.go index fd6db06e6346d..6112ea85b4d50 100644 --- a/executor/trace.go +++ b/executor/trace.go @@ -18,7 +18,7 @@ import ( "github.com/opentracing/basictracer-go" opentracing "github.com/opentracing/opentracing-go" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/planner" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/util/chunk" diff --git a/executor/union_scan.go b/executor/union_scan.go index 5722e04803814..aad9bb157fef4 100644 --- a/executor/union_scan.go +++ b/executor/union_scan.go @@ -17,8 +17,8 @@ import ( "sort" "time" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -126,9 +126,9 @@ func (us *UnionScanExec) Open(ctx context.Context) error { // Next implements the Executor Next interface. func (us *UnionScanExec) Next(ctx context.Context, chk *chunk.Chunk) error { - if us.runtimeStat != nil { + if us.runtimeStats != nil { start := time.Now() - defer func() { us.runtimeStat.Record(time.Now().Sub(start), chk.NumRows()) }() + defer func() { us.runtimeStats.Record(time.Now().Sub(start), chk.NumRows()) }() } chk.GrowAndReset(us.maxChunkSize) mutableRow := chunk.MutRowFromTypes(us.retTypes()) diff --git a/executor/update.go b/executor/update.go index de60b92ab8a01..9065cdbed6ec5 100644 --- a/executor/update.go +++ b/executor/update.go @@ -14,9 +14,9 @@ package executor import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -42,6 +42,7 @@ type UpdateExec struct { // columns2Handle stores relationship between column ordinal to its table handle. // the columns ordinals is present in ordinal range format, @see executor.cols2Handle columns2Handle cols2HandleSlice + evalBuffer chunk.MutRow } func (e *UpdateExec) exec(schema *expression.Schema) ([]types.Datum, error) { @@ -141,6 +142,7 @@ func (e *UpdateExec) fetchChunkRows(ctx context.Context) error { fields := e.children[0].retTypes() globalRowIdx := 0 chk := e.children[0].newFirstChunk() + e.evalBuffer = chunk.MutRowFromTypes(fields) for { err := e.children[0].Next(ctx, chk) if err != nil { @@ -181,17 +183,19 @@ func (e *UpdateExec) handleErr(colName model.CIStr, rowIdx int, err error) error func (e *UpdateExec) composeNewRow(rowIdx int, oldRow []types.Datum) ([]types.Datum, error) { newRowData := types.CopyRow(oldRow) + e.evalBuffer.SetDatums(newRowData...) for _, assign := range e.OrderedList { handleIdx, handleFound := e.columns2Handle.findHandle(int32(assign.Col.Index)) if handleFound && e.canNotUpdate(oldRow[handleIdx]) { continue } - val, err := assign.Expr.Eval(chunk.MutRowFromDatums(newRowData).ToRow()) + val, err := assign.Expr.Eval(e.evalBuffer.ToRow()) if err1 := e.handleErr(assign.Col.ColName, rowIdx, err); err1 != nil { - return nil, errors.Trace(err1) + return nil, err1 } - newRowData[assign.Col.Index] = val + newRowData[assign.Col.Index] = *val.Copy() + e.evalBuffer.SetDatum(assign.Col.Index, val) } return newRowData, nil } diff --git a/executor/write.go b/executor/write.go index de34f67bce23b..7f5b8709720d9 100644 --- a/executor/write.go +++ b/executor/write.go @@ -16,9 +16,9 @@ package executor import ( "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -161,15 +161,6 @@ func updateRecord(ctx sessionctx.Context, h int64, oldData, newData []types.Datu } } - // 6. Update delta for the statistics. - colSize := make(map[int64]int64) - for id, col := range t.Cols() { - val := int64(len(newData[id].GetBytes()) - len(oldData[id].GetBytes())) - if val != 0 { - colSize[col.ID] = val - } - } - ctx.GetSessionVars().TxnCtx.UpdateDeltaForTable(t.Meta().ID, 0, 1, colSize) return true, handleChanged, newHandle, nil } diff --git a/executor/write_test.go b/executor/write_test.go index 3079c9c35f001..59f6667946615 100644 --- a/executor/write_test.go +++ b/executor/write_test.go @@ -19,9 +19,9 @@ import ( "sync/atomic" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" @@ -2091,3 +2091,17 @@ func (s *testSuite) TestRebaseIfNeeded(c *C) { tk.MustExec(`insert into t (b) values (6);`) tk.MustQuery(`select a from t where b = 6;`).Check(testkit.Rows("30003")) } + +func (s *testSuite) TestDeferConstraintCheckForInsert(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists t;create table t (i int key);`) + tk.MustExec(`insert t values (1);`) + tk.MustExec(`set tidb_constraint_check_in_place = 1;`) + tk.MustExec(`begin;`) + _, err := tk.Exec(`insert t values (1);`) + c.Assert(err, NotNil) + tk.MustExec(`update t set i = 2 where i = 1;`) + tk.MustExec(`commit;`) + tk.MustQuery(`select * from t;`).Check(testkit.Rows("2")) +} diff --git a/expression/aggregation/agg_to_pb.go b/expression/aggregation/agg_to_pb.go index 31a743d59621a..59d09db237701 100644 --- a/expression/aggregation/agg_to_pb.go +++ b/expression/aggregation/agg_to_pb.go @@ -14,7 +14,7 @@ package aggregation import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" diff --git a/expression/aggregation/agg_to_pb_test.go b/expression/aggregation/agg_to_pb_test.go index 2a17b120e5394..af8ca6d26f8a2 100644 --- a/expression/aggregation/agg_to_pb_test.go +++ b/expression/aggregation/agg_to_pb_test.go @@ -18,10 +18,10 @@ import ( "testing" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" diff --git a/expression/aggregation/aggregation.go b/expression/aggregation/aggregation.go index 9d2ac730767e3..62eba44691139 100644 --- a/expression/aggregation/aggregation.go +++ b/expression/aggregation/aggregation.go @@ -16,14 +16,14 @@ package aggregation import ( "bytes" "fmt" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tipb/go-tipb" "github.com/pkg/errors" diff --git a/expression/aggregation/aggregation_test.go b/expression/aggregation/aggregation_test.go index 9040f06aeccc9..0ebbe8a330eef 100644 --- a/expression/aggregation/aggregation_test.go +++ b/expression/aggregation/aggregation_test.go @@ -17,9 +17,9 @@ import ( "math" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" diff --git a/expression/aggregation/avg.go b/expression/aggregation/avg.go index b934e6be2eb6a..04d70fa985d04 100644 --- a/expression/aggregation/avg.go +++ b/expression/aggregation/avg.go @@ -15,9 +15,9 @@ package aggregation import ( "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pkg/errors" diff --git a/expression/aggregation/bench_test.go b/expression/aggregation/bench_test.go index 5b7c2bcee2e4f..e49deebe00da3 100644 --- a/expression/aggregation/bench_test.go +++ b/expression/aggregation/bench_test.go @@ -16,9 +16,9 @@ package aggregation import ( "testing" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" ) diff --git a/expression/aggregation/descriptor.go b/expression/aggregation/descriptor.go index 7c47ec85c0d64..e631c9cd6629d 100644 --- a/expression/aggregation/descriptor.go +++ b/expression/aggregation/descriptor.go @@ -21,14 +21,14 @@ import ( "strings" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" ) // AggFuncDesc describes an aggregation function signature, only used in planner. diff --git a/expression/bench_test.go b/expression/bench_test.go index 1704afa516d3c..bc4a58ed81b45 100644 --- a/expression/bench_test.go +++ b/expression/bench_test.go @@ -20,12 +20,12 @@ import ( "testing" "time" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" ) diff --git a/expression/builtin.go b/expression/builtin.go index ba165008278f9..51379440e7e28 100644 --- a/expression/builtin.go +++ b/expression/builtin.go @@ -18,13 +18,13 @@ package expression import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tipb/go-tipb" ) diff --git a/expression/builtin_arithmetic.go b/expression/builtin_arithmetic.go index 85c620264d25d..1f7369699519a 100644 --- a/expression/builtin_arithmetic.go +++ b/expression/builtin_arithmetic.go @@ -18,9 +18,9 @@ import ( "math" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tipb/go-tipb" diff --git a/expression/builtin_arithmetic_test.go b/expression/builtin_arithmetic_test.go index 68fe74333ef5a..61a47bbc5d334 100644 --- a/expression/builtin_arithmetic_test.go +++ b/expression/builtin_arithmetic_test.go @@ -17,8 +17,8 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/builtin_cast.go b/expression/builtin_cast.go index f30437dc0c39a..df3092c0997b4 100644 --- a/expression/builtin_cast.go +++ b/expression/builtin_cast.go @@ -26,14 +26,14 @@ import ( "strconv" "strings" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tipb/go-tipb" "github.com/pkg/errors" diff --git a/expression/builtin_cast_test.go b/expression/builtin_cast_test.go index ab92b03021295..c754d5a5a23e0 100644 --- a/expression/builtin_cast_test.go +++ b/expression/builtin_cast_test.go @@ -20,11 +20,11 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" ) diff --git a/expression/builtin_compare.go b/expression/builtin_compare.go index c83f861b546b7..0744720694378 100644 --- a/expression/builtin_compare.go +++ b/expression/builtin_compare.go @@ -16,11 +16,11 @@ package expression import ( "math" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index 4ce6c3386e750..24cd01ea541dd 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -17,8 +17,8 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/builtin_control.go b/expression/builtin_control.go index 9900a22bed4a8..fc8013f6096cc 100644 --- a/expression/builtin_control.go +++ b/expression/builtin_control.go @@ -15,11 +15,11 @@ package expression import ( "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tipb/go-tipb" "github.com/pkg/errors" diff --git a/expression/builtin_control_test.go b/expression/builtin_control_test.go index de589e1a0b4fc..37101ec326f88 100644 --- a/expression/builtin_control_test.go +++ b/expression/builtin_control_test.go @@ -18,7 +18,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/builtin_encryption.go b/expression/builtin_encryption.go index 94eaef8a84574..7772cd344a8a2 100644 --- a/expression/builtin_encryption.go +++ b/expression/builtin_encryption.go @@ -28,11 +28,11 @@ import ( "io" "strings" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/encrypt" "github.com/pkg/errors" diff --git a/expression/builtin_encryption_test.go b/expression/builtin_encryption_test.go index 99f29ea972933..7a1b09254f6f2 100644 --- a/expression/builtin_encryption_test.go +++ b/expression/builtin_encryption_test.go @@ -18,9 +18,9 @@ import ( "strings" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" diff --git a/expression/builtin_info.go b/expression/builtin_info.go index b498e96f289e1..62b04255af9c9 100644 --- a/expression/builtin_info.go +++ b/expression/builtin_info.go @@ -18,7 +18,7 @@ package expression import ( - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -148,14 +148,12 @@ func (b *builtinCurrentUserSig) Clone() builtinFunc { // evalString evals a builtinCurrentUserSig. // See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user -// TODO: The value of CURRENT_USER() can differ from the value of USER(). We will finish this after we support grant tables. func (b *builtinCurrentUserSig) evalString(row chunk.Row) (string, bool, error) { data := b.ctx.GetSessionVars() if data == nil || data.User == nil { return "", true, errors.Errorf("Missing session variable when eval builtin") } - - return data.User.String(), false, nil + return data.User.AuthIdentityString(), false, nil } type userFunctionClass struct { diff --git a/expression/builtin_info_test.go b/expression/builtin_info_test.go index c71ce15c88bd5..ba9e53c2dc2a4 100644 --- a/expression/builtin_info_test.go +++ b/expression/builtin_info_test.go @@ -17,11 +17,11 @@ import ( "math" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/printer" @@ -84,7 +84,7 @@ func (s *testEvaluatorSuite) TestCurrentUser(c *C) { defer testleak.AfterTest(c)() ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() - sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} + sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost", AuthUsername: "root", AuthHostname: "localhost"} fc := funcs[ast.CurrentUser] f, err := fc.getFunction(ctx, nil) diff --git a/expression/builtin_json.go b/expression/builtin_json.go index 9a1fdb318546b..f922c6cac8d90 100644 --- a/expression/builtin_json.go +++ b/expression/builtin_json.go @@ -14,8 +14,8 @@ package expression import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" @@ -61,6 +61,8 @@ var ( _ builtinFunc = &builtinJSONRemoveSig{} _ builtinFunc = &builtinJSONMergeSig{} _ builtinFunc = &builtinJSONContainsSig{} + _ builtinFunc = &builtinJSONKeysSig{} + _ builtinFunc = &builtinJSONKeys2ArgsSig{} _ builtinFunc = &builtinJSONLengthSig{} ) @@ -766,7 +768,88 @@ type jsonKeysFunctionClass struct { } func (c *jsonKeysFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { - return nil, errFunctionNotExists.GenWithStackByArgs("FUNCTION", "JSON_KEYS") + if err := c.verifyArgs(args); err != nil { + return nil, errors.Trace(err) + } + argTps := []types.EvalType{types.ETJson} + if len(args) == 2 { + argTps = append(argTps, types.ETString) + } + bf := newBaseBuiltinFuncWithTp(ctx, args, types.ETJson, argTps...) + var sig builtinFunc + switch len(args) { + case 1: + sig = &builtinJSONKeysSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_JsonKeysSig) + case 2: + sig = &builtinJSONKeys2ArgsSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_JsonKeys2ArgsSig) + } + return sig, nil +} + +type builtinJSONKeysSig struct { + baseBuiltinFunc +} + +func (b *builtinJSONKeysSig) Clone() builtinFunc { + newSig := &builtinJSONKeysSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinJSONKeysSig) evalJSON(row chunk.Row) (res json.BinaryJSON, isNull bool, err error) { + res, isNull, err = b.args[0].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, errors.Trace(err) + } + if res.TypeCode != json.TypeCodeObject { + return res, true, json.ErrInvalidJSONData + } + return res.GetKeys(), false, nil +} + +type builtinJSONKeys2ArgsSig struct { + baseBuiltinFunc +} + +func (b *builtinJSONKeys2ArgsSig) Clone() builtinFunc { + newSig := &builtinJSONKeys2ArgsSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinJSONKeys2ArgsSig) evalJSON(row chunk.Row) (res json.BinaryJSON, isNull bool, err error) { + res, isNull, err = b.args[0].EvalJSON(b.ctx, row) + if isNull || err != nil { + return res, isNull, errors.Trace(err) + } + if res.TypeCode != json.TypeCodeObject { + return res, true, json.ErrInvalidJSONData + } + + path, isNull, err := b.args[1].EvalString(b.ctx, row) + if isNull || err != nil { + return res, isNull, errors.Trace(err) + } + + pathExpr, err := json.ParseJSONPathExpr(path) + if err != nil { + return res, true, errors.Trace(err) + } + if pathExpr.ContainsAnyAsterisk() { + return res, true, json.ErrInvalidJSONPathWildcard + } + + res, exists := res.Extract([]json.PathExpression{pathExpr}) + if !exists { + return res, true, nil + } + if res.TypeCode != json.TypeCodeObject { + return res, true, json.ErrInvalidJSONData + } + + return res.GetKeys(), false, nil } type jsonLengthFunctionClass struct { diff --git a/expression/builtin_json_test.go b/expression/builtin_json_test.go index ab4be5790ad9f..1c3b5ed1d7e0b 100644 --- a/expression/builtin_json_test.go +++ b/expression/builtin_json_test.go @@ -15,7 +15,7 @@ package expression import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" @@ -485,6 +485,7 @@ func (s *testEvaluatorSuite) TestJSONLength(c *C) { d, err := evalBuiltinFunc(f, chunk.Row{}) if t.success { c.Assert(err, IsNil) + if t.expected == nil { c.Assert(d.IsNull(), IsTrue) } else { @@ -495,3 +496,72 @@ func (s *testEvaluatorSuite) TestJSONLength(c *C) { } } } + +func (s *testEvaluatorSuite) TestJSONKeys(c *C) { + defer testleak.AfterTest(c)() + fc := funcs[ast.JSONKeys] + tbl := []struct { + input []interface{} + expected interface{} + success bool + }{ + // Tests nil arguments + {[]interface{}{nil}, nil, true}, + {[]interface{}{nil, "$.c"}, nil, true}, + {[]interface{}{`{"a": 1}`, nil}, nil, true}, + {[]interface{}{nil, nil}, nil, true}, + + // Tests with other type + {[]interface{}{`1`}, nil, false}, + {[]interface{}{`"str"`}, nil, false}, + {[]interface{}{`true`}, nil, false}, + {[]interface{}{`null`}, nil, false}, + {[]interface{}{`[1, 2]`}, nil, false}, + {[]interface{}{`["1", "2"]`}, nil, false}, + + // Tests without path expression + {[]interface{}{`{}`}, `[]`, true}, + {[]interface{}{`{"a": 1}`}, `["a"]`, true}, + {[]interface{}{`{"a": 1, "b": 2}`}, `["a", "b"]`, true}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`}, `["a", "b"]`, true}, + + // Tests with path expression + {[]interface{}{`{"a": 1}`, "$.a"}, nil, false}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`, "$.a"}, `["c"]`, true}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`, "$.a.c"}, nil, false}, + + // Tests path expression contains any asterisk + {[]interface{}{`{}`, "$.*"}, nil, false}, + {[]interface{}{`{"a": 1}`, "$.*"}, nil, false}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`, "$.*"}, nil, false}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`, "$.a.*"}, nil, false}, + + // Tests path expression does not identify a section of the target document + {[]interface{}{`{"a": 1}`, "$.b"}, nil, true}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`, "$.c"}, nil, true}, + {[]interface{}{`{"a": {"c": 3}, "b": 2}`, "$.a.d"}, nil, true}, + } + for _, t := range tbl { + args := types.MakeDatums(t.input...) + f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) + c.Assert(err, IsNil) + d, err := evalBuiltinFunc(f, chunk.Row{}) + if t.success { + c.Assert(err, IsNil) + switch x := t.expected.(type) { + case string: + var j1 json.BinaryJSON + j1, err = json.ParseBinaryFromString(x) + c.Assert(err, IsNil) + j2 := d.GetMysqlJSON() + var cmp int + cmp = json.CompareBinary(j1, j2) + c.Assert(cmp, Equals, 0) + case nil: + c.Assert(d.IsNull(), IsTrue) + } + } else { + c.Assert(err, NotNil) + } + } +} diff --git a/expression/builtin_like.go b/expression/builtin_like.go index 43312813cae94..5ac4a4a831adf 100644 --- a/expression/builtin_like.go +++ b/expression/builtin_like.go @@ -15,8 +15,10 @@ package expression import ( "regexp" + "strings" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/stringutil" @@ -80,6 +82,12 @@ func (b *builtinLikeSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, isNull, errors.Trace(err) } escape := byte(val) + + if variable.SysVars["lower_case_table_names"].Value != "0" { + patternStr = strings.ToLower(patternStr) + valStr = strings.ToLower(valStr) + } + patChars, patTypes := stringutil.CompilePattern(patternStr, escape) match := stringutil.DoMatch(valStr, patChars, patTypes) return boolToInt64(match), false, nil diff --git a/expression/builtin_math.go b/expression/builtin_math.go index 04c59608d3bbd..f0770420e0cf9 100644 --- a/expression/builtin_math.go +++ b/expression/builtin_math.go @@ -27,7 +27,7 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -110,6 +110,7 @@ var ( _ builtinFunc = &builtinTruncateIntSig{} _ builtinFunc = &builtinTruncateRealSig{} _ builtinFunc = &builtinTruncateDecimalSig{} + _ builtinFunc = &builtinTruncateUintSig{} ) type absFunctionClass struct { @@ -1737,7 +1738,11 @@ func (c *truncateFunctionClass) getFunction(ctx sessionctx.Context, args []Expre var sig builtinFunc switch argTp { case types.ETInt: - sig = &builtinTruncateIntSig{bf} + if mysql.HasUnsignedFlag(args[0].GetType().Flag) { + sig = &builtinTruncateUintSig{bf} + } else { + sig = &builtinTruncateIntSig{bf} + } case types.ETReal: sig = &builtinTruncateRealSig{bf} case types.ETDecimal: @@ -1826,6 +1831,39 @@ func (b *builtinTruncateIntSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, isNull, errors.Trace(err) } - floatX := float64(x) - return int64(types.Truncate(floatX, int(d))), false, nil + if d >= 0 { + return x, false, nil + } + shift := int64(math.Pow10(int(-d))) + return x / shift * shift, false, nil +} + +func (b *builtinTruncateUintSig) Clone() builtinFunc { + newSig := &builtinTruncateUintSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +type builtinTruncateUintSig struct { + baseBuiltinFunc +} + +// evalInt evals a TRUNCATE(X,D). +// See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_truncate +func (b *builtinTruncateUintSig) evalInt(row chunk.Row) (int64, bool, error) { + x, isNull, err := b.args[0].EvalInt(b.ctx, row) + if isNull || err != nil { + return 0, isNull, errors.Trace(err) + } + uintx := uint64(x) + + d, isNull, err := b.args[1].EvalInt(b.ctx, row) + if isNull || err != nil { + return 0, isNull, errors.Trace(err) + } + if d >= 0 { + return x, false, nil + } + shift := uint64(math.Pow10(int(-d))) + return int64(uintx / shift * shift), false, nil } diff --git a/expression/builtin_math_test.go b/expression/builtin_math_test.go index a0c291603a5c3..4a557302bba65 100644 --- a/expression/builtin_math_test.go +++ b/expression/builtin_math_test.go @@ -20,10 +20,10 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" "github.com/pingcap/tidb/util/testutil" @@ -485,6 +485,9 @@ func (s *testEvaluatorSuite) TestTruncate(c *C) { {[]interface{}{newDec("23.298"), -100}, newDec("0")}, {[]interface{}{newDec("23.298"), 100}, newDec("23.298")}, {[]interface{}{nil, 2}, nil}, + {[]interface{}{uint64(9223372036854775808), -10}, 9223372030000000000}, + {[]interface{}{9223372036854775807, -7}, 9223372036850000000}, + {[]interface{}{uint64(18446744073709551615), -10}, uint64(18446744070000000000)}, } Dtbl := tblToDtbl(tbl) diff --git a/expression/builtin_miscellaneous.go b/expression/builtin_miscellaneous.go index b249551247340..c046861911395 100644 --- a/expression/builtin_miscellaneous.go +++ b/expression/builtin_miscellaneous.go @@ -21,11 +21,11 @@ import ( "strings" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pkg/errors" "github.com/twinj/uuid" diff --git a/expression/builtin_miscellaneous_test.go b/expression/builtin_miscellaneous_test.go index 213ed1e8d1cc7..79143dad631a4 100644 --- a/expression/builtin_miscellaneous_test.go +++ b/expression/builtin_miscellaneous_test.go @@ -17,7 +17,7 @@ import ( "strings" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/builtin_op.go b/expression/builtin_op.go index 1c4109da9c1b1..e98d83af53835 100644 --- a/expression/builtin_op.go +++ b/expression/builtin_op.go @@ -17,8 +17,8 @@ import ( "fmt" "math" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/builtin_op_test.go b/expression/builtin_op_test.go index 5e726be8745c7..f57f17aab557f 100644 --- a/expression/builtin_op_test.go +++ b/expression/builtin_op_test.go @@ -17,7 +17,7 @@ import ( "math" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/builtin_other.go b/expression/builtin_other.go index 8afc8e9c0cce6..7cfc36e46541a 100644 --- a/expression/builtin_other.go +++ b/expression/builtin_other.go @@ -16,7 +16,7 @@ package expression import ( "strings" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" diff --git a/expression/builtin_other_test.go b/expression/builtin_other_test.go index b0b3494cbed92..0d4a8dee9499f 100644 --- a/expression/builtin_other_test.go +++ b/expression/builtin_other_test.go @@ -19,8 +19,8 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" diff --git a/expression/builtin_string.go b/expression/builtin_string.go index fd429d893a354..ac1dc3f2a8b53 100644 --- a/expression/builtin_string.go +++ b/expression/builtin_string.go @@ -27,12 +27,12 @@ import ( "strings" "unicode/utf8" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" "github.com/pkg/errors" diff --git a/expression/builtin_string_test.go b/expression/builtin_string_test.go index c90068ae365fe..944b763bb8121 100644 --- a/expression/builtin_string_test.go +++ b/expression/builtin_string_test.go @@ -20,12 +20,12 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/builtin_test.go b/expression/builtin_test.go index b12f49ada982a..2be7dccf751cf 100644 --- a/expression/builtin_test.go +++ b/expression/builtin_test.go @@ -17,12 +17,12 @@ import ( "reflect" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" "github.com/pkg/errors" diff --git a/expression/builtin_time.go b/expression/builtin_time.go index dd04e9c294b05..d171e058896e8 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -26,10 +26,10 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tipb/go-tipb" diff --git a/expression/builtin_time_test.go b/expression/builtin_time_test.go index f58df38ac6497..b5361b4bd7a17 100644 --- a/expression/builtin_time_test.go +++ b/expression/builtin_time_test.go @@ -20,13 +20,13 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/chunk_executor.go b/expression/chunk_executor.go index 857211d65a3e1..76efd21031af0 100644 --- a/expression/chunk_executor.go +++ b/expression/chunk_executor.go @@ -16,8 +16,8 @@ package expression import ( "strconv" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/column.go b/expression/column.go index 2c47c38b451c3..5306565373996 100644 --- a/expression/column.go +++ b/expression/column.go @@ -17,8 +17,8 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" diff --git a/expression/column_test.go b/expression/column_test.go index 62a180aab604a..8f11509783055 100644 --- a/expression/column_test.go +++ b/expression/column_test.go @@ -15,8 +15,8 @@ package expression import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/constant.go b/expression/constant.go index a7a83ebe9b2cb..3c6a95948f446 100644 --- a/expression/constant.go +++ b/expression/constant.go @@ -16,10 +16,10 @@ package expression import ( "fmt" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/constant_fold.go b/expression/constant_fold.go index 0553b2c8c0c2a..738def5d041bb 100644 --- a/expression/constant_fold.go +++ b/expression/constant_fold.go @@ -14,7 +14,7 @@ package expression import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/util/chunk" log "github.com/sirupsen/logrus" ) @@ -118,9 +118,15 @@ func foldConstant(expr Expression) (Expression, bool) { return expr, isDeferredConst } if value.IsNull() { + if isDeferredConst { + return &Constant{Value: value, RetType: x.RetType, DeferredExpr: x}, true + } return &Constant{Value: value, RetType: x.RetType}, false } if isTrue, err := value.ToBool(sc); err == nil && isTrue == 0 { + if isDeferredConst { + return &Constant{Value: value, RetType: x.RetType, DeferredExpr: x}, true + } return &Constant{Value: value, RetType: x.RetType}, false } return expr, isDeferredConst diff --git a/expression/constant_propagation.go b/expression/constant_propagation.go index 2919c5dc359c8..aee7139db2080 100644 --- a/expression/constant_propagation.go +++ b/expression/constant_propagation.go @@ -14,12 +14,13 @@ package expression import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/disjointset" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) @@ -27,36 +28,115 @@ import ( // MaxPropagateColsCnt means the max number of columns that can participate propagation. var MaxPropagateColsCnt = 100 -type multiEqualSet struct { - parent []int +type basePropConstSolver struct { + colMapper map[int64]int // colMapper maps column to its index + eqList []*Constant // if eqList[i] != nil, it means col_i = eqList[i] + unionSet *disjointset.IntSet // unionSet stores the relations like col_i = col_j + columns []*Column // columns stores all columns appearing in the conditions + ctx sessionctx.Context } -func (m *multiEqualSet) init(l int) { - m.parent = make([]int, l) - for i := range m.parent { - m.parent[i] = i +func (s *basePropConstSolver) getColID(col *Column) int { + return s.colMapper[col.UniqueID] +} + +func (s *basePropConstSolver) insertCol(col *Column) { + _, ok := s.colMapper[col.UniqueID] + if !ok { + s.colMapper[col.UniqueID] = len(s.colMapper) + s.columns = append(s.columns, col) } } -func (m *multiEqualSet) addRelation(a int, b int) { - m.parent[m.findRoot(a)] = m.findRoot(b) +// tryToUpdateEQList tries to update the eqList. When the eqList has store this column with a different constant, like +// a = 1 and a = 2, we set the second return value to false. +func (s *basePropConstSolver) tryToUpdateEQList(col *Column, con *Constant) (bool, bool) { + if con.Value.IsNull() { + return false, true + } + id := s.getColID(col) + oldCon := s.eqList[id] + if oldCon != nil { + return false, !oldCon.Equal(s.ctx, con) + } + s.eqList[id] = con + return true, false } -func (m *multiEqualSet) findRoot(a int) int { - if a == m.parent[a] { - return a +// validEqualCond checks if the cond is an expression like [column eq constant]. +func validEqualCond(cond Expression) (*Column, *Constant) { + if eq, ok := cond.(*ScalarFunction); ok { + if eq.FuncName.L != ast.EQ { + return nil, nil + } + if col, colOk := eq.GetArgs()[0].(*Column); colOk { + if con, conOk := eq.GetArgs()[1].(*Constant); conOk { + return col, con + } + } + if col, colOk := eq.GetArgs()[1].(*Column); colOk { + if con, conOk := eq.GetArgs()[0].(*Constant); conOk { + return col, con + } + } } - m.parent[a] = m.findRoot(m.parent[a]) - return m.parent[a] + return nil, nil } -type propagateConstantSolver struct { - colMapper map[string]int // colMapper maps column to its index - unionSet *multiEqualSet // unionSet stores the relations like col_i = col_j - eqList []*Constant // if eqList[i] != nil, it means col_i = eqList[i] - columns []*Column // columns stores all columns appearing in the conditions +// tryToReplaceCond aims to replace all occurrences of column 'src' and try to replace it with 'tgt' in 'cond' +// It returns +// bool: if a replacement happened +// bool: if 'cond' contains non-deterministic expression +// Expression: the replaced expression, or original 'cond' if the replacement didn't happen +// +// For example: +// for 'a, b, a < 3', it returns 'true, false, b < 3' +// for 'a, b, sin(a) + cos(a) = 5', it returns 'true, false, returns sin(b) + cos(b) = 5' +// for 'a, b, cast(a) < rand()', it returns 'false, true, cast(a) < rand()' +func tryToReplaceCond(ctx sessionctx.Context, src *Column, tgt *Column, cond Expression) (bool, bool, Expression) { + sf, ok := cond.(*ScalarFunction) + if !ok { + return false, false, cond + } + replaced := false + var args []Expression + if _, ok := unFoldableFunctions[sf.FuncName.L]; ok { + return false, true, cond + } + if _, ok := inequalFunctions[sf.FuncName.L]; ok { + return false, true, cond + } + for idx, expr := range sf.GetArgs() { + if src.Equal(nil, expr) { + replaced = true + if args == nil { + args = make([]Expression, len(sf.GetArgs())) + copy(args, sf.GetArgs()) + } + args[idx] = tgt + } else { + subReplaced, isNonDeterminisitic, subExpr := tryToReplaceCond(ctx, src, tgt, expr) + if isNonDeterminisitic { + return false, true, cond + } else if subReplaced { + replaced = true + if args == nil { + args = make([]Expression, len(sf.GetArgs())) + copy(args, sf.GetArgs()) + } + args[idx] = subExpr + } + } + } + if replaced { + return true, false, NewFunctionInternal(ctx, sf.FuncName.L, sf.GetType(), args...) + } + return false, false, cond +} + +type propConstSolver struct { + basePropConstSolver conditions []Expression - ctx sessionctx.Context } // propagateConstantEQ propagates expressions like 'column = constant' by substituting the constant for column, the @@ -64,7 +144,7 @@ type propagateConstantSolver struct { // a = d & b * 2 = c & c = d + 2 & b = 1 & a = 4, we pick eq cond b = 1 and a = 4 // d = 4 & 2 = c & c = d + 2 & b = 1 & a = 4, we propagate b = 1 and a = 4 and pick eq cond c = 2 and d = 4 // d = 4 & 2 = c & false & b = 1 & a = 4, we propagate c = 2 and d = 4, and do constant folding: c = d + 2 will be folded as false. -func (s *propagateConstantSolver) propagateConstantEQ() { +func (s *propConstSolver) propagateConstantEQ() { s.eqList = make([]*Constant, len(s.columns)) visited := make([]bool, len(s.conditions)) for i := 0; i < MaxPropagateColsCnt; i++ { @@ -104,10 +184,9 @@ func (s *propagateConstantSolver) propagateConstantEQ() { // TODO: remove redundancies later // // We maintain a unionSet representing the equivalent for every two columns. -func (s *propagateConstantSolver) propagateColumnEQ() { +func (s *propConstSolver) propagateColumnEQ() { visited := make([]bool, len(s.conditions)) - s.unionSet = &multiEqualSet{} - s.unionSet.init(len(s.columns)) + s.unionSet = disjointset.NewIntSet(len(s.columns)) for i := range s.conditions { if fun, ok := s.conditions[i].(*ScalarFunction); ok && fun.FuncName.L == ast.EQ { lCol, lOk := fun.GetArgs()[0].(*Column) @@ -115,7 +194,7 @@ func (s *propagateConstantSolver) propagateColumnEQ() { if lOk && rOk { lID := s.getColID(lCol) rID := s.getColID(rCol) - s.unionSet.addRelation(lID, rID) + s.unionSet.Union(lID, rID) visited[i] = true } } @@ -125,7 +204,7 @@ func (s *propagateConstantSolver) propagateColumnEQ() { for i, coli := range s.columns { for j := i + 1; j < len(s.columns); j++ { // unionSet doesn't have iterate(), we use a two layer loop to iterate col_i = col_j relation - if s.unionSet.findRoot(i) != s.unionSet.findRoot(j) { + if s.unionSet.FindRoot(i) != s.unionSet.FindRoot(j) { continue } colj := s.columns[j] @@ -135,11 +214,11 @@ func (s *propagateConstantSolver) propagateColumnEQ() { continue } cond := s.conditions[k] - replaced, _, newExpr := s.tryToReplaceCond(coli, colj, cond) + replaced, _, newExpr := tryToReplaceCond(s.ctx, coli, colj, cond) if replaced { s.conditions = append(s.conditions, newExpr) } - replaced, _, newExpr = s.tryToReplaceCond(colj, coli, cond) + replaced, _, newExpr = tryToReplaceCond(s.ctx, colj, coli, cond) if replaced { s.conditions = append(s.conditions, newExpr) } @@ -148,78 +227,7 @@ func (s *propagateConstantSolver) propagateColumnEQ() { } } -// validEqualCond checks if the cond is an expression like [column eq constant]. -func (s *propagateConstantSolver) validEqualCond(cond Expression) (*Column, *Constant) { - if eq, ok := cond.(*ScalarFunction); ok { - if eq.FuncName.L != ast.EQ { - return nil, nil - } - if col, colOk := eq.GetArgs()[0].(*Column); colOk { - if con, conOk := eq.GetArgs()[1].(*Constant); conOk { - return col, con - } - } - if col, colOk := eq.GetArgs()[1].(*Column); colOk { - if con, conOk := eq.GetArgs()[0].(*Constant); conOk { - return col, con - } - } - } - return nil, nil -} - -// tryToReplaceCond aims to replace all occurrences of column 'src' and try to replace it with 'tgt' in 'cond' -// It returns -// bool: if a replacement happened -// bool: if 'cond' contains non-deterministic expression -// Expression: the replaced expression, or original 'cond' if the replacement didn't happen -// -// For example: -// for 'a, b, a < 3', it returns 'true, false, b < 3' -// for 'a, b, sin(a) + cos(a) = 5', it returns 'true, false, returns sin(b) + cos(b) = 5' -// for 'a, b, cast(a) < rand()', it returns 'false, true, cast(a) < rand()' -func (s *propagateConstantSolver) tryToReplaceCond(src *Column, tgt *Column, cond Expression) (bool, bool, Expression) { - sf, ok := cond.(*ScalarFunction) - if !ok { - return false, false, cond - } - replaced := false - var args []Expression - if _, ok := unFoldableFunctions[sf.FuncName.L]; ok { - return false, true, cond - } - if _, ok := inequalFunctions[sf.FuncName.L]; ok { - return false, true, cond - } - for idx, expr := range sf.GetArgs() { - if src.Equal(nil, expr) { - replaced = true - if args == nil { - args = make([]Expression, len(sf.GetArgs())) - copy(args, sf.GetArgs()) - } - args[idx] = tgt - } else { - subReplaced, isNonDeterminisitic, subExpr := s.tryToReplaceCond(src, tgt, expr) - if isNonDeterminisitic { - return false, true, cond - } else if subReplaced { - replaced = true - if args == nil { - args = make([]Expression, len(sf.GetArgs())) - copy(args, sf.GetArgs()) - } - args[idx] = subExpr - } - } - } - if replaced { - return true, false, NewFunctionInternal(s.ctx, sf.FuncName.L, sf.GetType(), args...) - } - return false, false, cond -} - -func (s *propagateConstantSolver) setConds2ConstFalse() { +func (s *propConstSolver) setConds2ConstFalse() { s.conditions = []Expression{&Constant{ Value: types.NewDatum(false), RetType: types.NewFieldType(mysql.TypeTiny), @@ -227,19 +235,22 @@ func (s *propagateConstantSolver) setConds2ConstFalse() { } // pickNewEQConds tries to pick new equal conds and puts them to retMapper. -func (s *propagateConstantSolver) pickNewEQConds(visited []bool) (retMapper map[int]*Constant) { +func (s *propConstSolver) pickNewEQConds(visited []bool) (retMapper map[int]*Constant) { retMapper = make(map[int]*Constant) for i, cond := range s.conditions { if visited[i] { continue } - col, con := s.validEqualCond(cond) + col, con := validEqualCond(cond) // Then we check if this CNF item is a false constant. If so, we will set the whole condition to false. var ok bool if col == nil { if con, ok = cond.(*Constant); ok { value, err := EvalBool(s.ctx, []Expression{con}, chunk.Row{}) - terror.Log(errors.Trace(err)) + if err != nil { + terror.Log(errors.Trace(err)) + return nil + } if !value { s.setConds2ConstFalse() return nil @@ -260,22 +271,7 @@ func (s *propagateConstantSolver) pickNewEQConds(visited []bool) (retMapper map[ return } -// tryToUpdateEQList tries to update the eqList. When the eqList has store this column with a different constant, like -// a = 1 and a = 2, we set the second return value to false. -func (s *propagateConstantSolver) tryToUpdateEQList(col *Column, con *Constant) (bool, bool) { - if con.Value.IsNull() { - return false, true - } - id := s.getColID(col) - oldCon := s.eqList[id] - if oldCon != nil { - return false, !oldCon.Equal(s.ctx, con) - } - s.eqList[id] = con - return true, false -} - -func (s *propagateConstantSolver) solve(conditions []Expression) []Expression { +func (s *propConstSolver) solve(conditions []Expression) []Expression { cols := make([]*Column, 0, len(conditions)) for _, cond := range conditions { s.conditions = append(s.conditions, SplitCNFItems(cond)...) @@ -290,37 +286,268 @@ func (s *propagateConstantSolver) solve(conditions []Expression) []Expression { } s.propagateConstantEQ() s.propagateColumnEQ() - for i, cond := range s.conditions { - if dnf, ok := cond.(*ScalarFunction); ok && dnf.FuncName.L == ast.LogicOr { - dnfItems := SplitDNFItems(cond) - for j, item := range dnfItems { - dnfItems[j] = ComposeCNFCondition(s.ctx, PropagateConstant(s.ctx, []Expression{item})...) + s.conditions = propagateConstantDNF(s.ctx, s.conditions) + return s.conditions +} + +// PropagateConstant propagate constant values of deterministic predicates in a condition. +func PropagateConstant(ctx sessionctx.Context, conditions []Expression) []Expression { + solver := &propConstSolver{} + solver.colMapper = make(map[int64]int) + solver.ctx = ctx + return solver.solve(conditions) +} + +type propOuterJoinConstSolver struct { + basePropConstSolver + joinConds []Expression + filterConds []Expression + outerSchema *Schema + innerSchema *Schema +} + +func (s *propOuterJoinConstSolver) setConds2ConstFalse(filterConds bool) { + s.joinConds = []Expression{&Constant{ + Value: types.NewDatum(false), + RetType: types.NewFieldType(mysql.TypeTiny), + }} + if filterConds { + s.filterConds = []Expression{&Constant{ + Value: types.NewDatum(false), + RetType: types.NewFieldType(mysql.TypeTiny), + }} + } +} + +// pickEQCondsOnOuterCol picks constant equal expression from specified conditions. +func (s *propOuterJoinConstSolver) pickEQCondsOnOuterCol(retMapper map[int]*Constant, visited []bool, filterConds bool) map[int]*Constant { + var conds []Expression + var condsOffset int + if filterConds { + conds = s.filterConds + } else { + conds = s.joinConds + condsOffset = len(s.filterConds) + } + for i, cond := range conds { + if visited[i+condsOffset] { + continue + } + col, con := validEqualCond(cond) + // Then we check if this CNF item is a false constant. If so, we will set the whole condition to false. + var ok bool + if col == nil { + if con, ok = cond.(*Constant); ok { + value, err := EvalBool(s.ctx, []Expression{con}, chunk.Row{}) + if err != nil { + terror.Log(errors.Trace(err)) + return nil + } + if !value { + s.setConds2ConstFalse(filterConds) + return nil + } } - s.conditions[i] = ComposeDNFCondition(s.ctx, dnfItems...) + continue + } + // Only extract `outerCol = const` expressions. + if !s.outerSchema.Contains(col) { + continue + } + visited[i+condsOffset] = true + updated, foreverFalse := s.tryToUpdateEQList(col, con) + if foreverFalse { + s.setConds2ConstFalse(filterConds) + return nil + } + if updated { + retMapper[s.getColID(col)] = con } } - return s.conditions + return retMapper } -func (s *propagateConstantSolver) getColID(col *Column) int { - code := col.HashCode(nil) - return s.colMapper[string(code)] +// pickNewEQConds picks constant equal expressions from join and filter conditions. +func (s *propOuterJoinConstSolver) pickNewEQConds(visited []bool) map[int]*Constant { + retMapper := make(map[int]*Constant) + retMapper = s.pickEQCondsOnOuterCol(retMapper, visited, true) + if retMapper == nil { + // Filter is constant false or error occured, enforce early termination. + return nil + } + retMapper = s.pickEQCondsOnOuterCol(retMapper, visited, false) + return retMapper } -func (s *propagateConstantSolver) insertCol(col *Column) { - code := col.HashCode(nil) - _, ok := s.colMapper[string(code)] - if !ok { - s.colMapper[string(code)] = len(s.colMapper) - s.columns = append(s.columns, col) +// propagateConstantEQ propagates expressions like `outerCol = const` by substituting `outerCol` in *JOIN* condition +// with `const`, the procedure repeats multiple times. +func (s *propOuterJoinConstSolver) propagateConstantEQ() { + s.eqList = make([]*Constant, len(s.columns)) + lenFilters := len(s.filterConds) + visited := make([]bool, lenFilters+len(s.joinConds)) + for i := 0; i < MaxPropagateColsCnt; i++ { + mapper := s.pickNewEQConds(visited) + if len(mapper) == 0 { + return + } + cols := make([]*Column, 0, len(mapper)) + cons := make([]Expression, 0, len(mapper)) + for id, con := range mapper { + cols = append(cols, s.columns[id]) + cons = append(cons, con) + } + for i, cond := range s.joinConds { + if !visited[i+lenFilters] { + s.joinConds[i] = ColumnSubstitute(cond, NewSchema(cols...), cons) + } + } } } -// PropagateConstant propagate constant values of deterministic predicates in a condition. -func PropagateConstant(ctx sessionctx.Context, conditions []Expression) []Expression { - solver := &propagateConstantSolver{ - colMapper: make(map[string]int), - ctx: ctx, +func (s *propOuterJoinConstSolver) colsFromOuterAndInner(col1, col2 *Column) (*Column, *Column) { + if s.outerSchema.Contains(col1) && s.innerSchema.Contains(col2) { + return col1, col2 } - return solver.solve(conditions) + if s.outerSchema.Contains(col2) && s.innerSchema.Contains(col1) { + return col2, col1 + } + return nil, nil +} + +// validColEqualCond checks if expression is column equal condition that we can use for constant +// propagation over outer join. We only use expression like `outerCol = innerCol`, for expressions like +// `outerCol1 = outerCol2` or `innerCol1 = innerCol2`, they do not help deriving new inner table conditions +// which can be pushed down to children plan nodes, so we do not pick them. +func (s *propOuterJoinConstSolver) validColEqualCond(cond Expression) (*Column, *Column) { + if fun, ok := cond.(*ScalarFunction); ok && fun.FuncName.L == ast.EQ { + lCol, lOk := fun.GetArgs()[0].(*Column) + rCol, rOk := fun.GetArgs()[1].(*Column) + if lOk && rOk { + return s.colsFromOuterAndInner(lCol, rCol) + } + } + return nil, nil + +} + +// deriveConds given `outerCol = innerCol`, derive new expression for specified conditions. +func (s *propOuterJoinConstSolver) deriveConds(outerCol, innerCol *Column, schema *Schema, fCondsOffset int, visited []bool, filterConds bool) []bool { + var offset, condsLen int + var conds []Expression + if filterConds { + conds = s.filterConds + offset = fCondsOffset + condsLen = len(s.filterConds) + } else { + conds = s.joinConds + condsLen = fCondsOffset + } + for k := 0; k < condsLen; k++ { + if visited[k+offset] { + // condition has been used to retrieve equality relation or contains column beyond children schema. + continue + } + cond := conds[k] + if !ExprFromSchema(cond, schema) { + visited[k+offset] = true + continue + } + replaced, _, newExpr := tryToReplaceCond(s.ctx, outerCol, innerCol, cond) + if replaced { + s.joinConds = append(s.joinConds, newExpr) + } + } + return visited +} + +// propagateColumnEQ propagates expressions like 'outerCol = innerCol' by adding extra filters +// 'expression(..., innerCol, ...)' derived from 'expression(..., outerCol, ...)' as long as +// 'expression(..., outerCol, ...)' does not reference columns outside children schemas of join node. +// Derived new expressions must be appended into join condition, not filter condition. +func (s *propOuterJoinConstSolver) propagateColumnEQ() { + visited := make([]bool, len(s.joinConds)+len(s.filterConds)) + s.unionSet = disjointset.NewIntSet(len(s.columns)) + var outerCol, innerCol *Column + // Only consider column equal condition in joinConds. + // If we have column equal in filter condition, the outer join should have been simplified already. + for i := range s.joinConds { + outerCol, innerCol = s.validColEqualCond(s.joinConds[i]) + if outerCol != nil { + outerID := s.getColID(outerCol) + innerID := s.getColID(innerCol) + s.unionSet.Union(outerID, innerID) + visited[i] = true + } + } + lenJoinConds := len(s.joinConds) + mergedSchema := MergeSchema(s.outerSchema, s.innerSchema) + for i, coli := range s.columns { + for j := i + 1; j < len(s.columns); j++ { + // unionSet doesn't have iterate(), we use a two layer loop to iterate col_i = col_j relation. + if s.unionSet.FindRoot(i) != s.unionSet.FindRoot(j) { + continue + } + colj := s.columns[j] + outerCol, innerCol = s.colsFromOuterAndInner(coli, colj) + if outerCol == nil { + continue + } + visited = s.deriveConds(outerCol, innerCol, mergedSchema, lenJoinConds, visited, false) + visited = s.deriveConds(outerCol, innerCol, mergedSchema, lenJoinConds, visited, true) + } + } +} + +func (s *propOuterJoinConstSolver) solve(joinConds, filterConds []Expression) ([]Expression, []Expression) { + cols := make([]*Column, 0, len(joinConds)+len(filterConds)) + for _, cond := range joinConds { + s.joinConds = append(s.joinConds, SplitCNFItems(cond)...) + cols = append(cols, ExtractColumns(cond)...) + } + for _, cond := range filterConds { + s.filterConds = append(s.filterConds, SplitCNFItems(cond)...) + cols = append(cols, ExtractColumns(cond)...) + } + for _, col := range cols { + s.insertCol(col) + } + if len(s.columns) > MaxPropagateColsCnt { + log.Warnf("[const_propagation_over_outerjoin] Too many columns: column count is %d, max count is %d.", len(s.columns), MaxPropagateColsCnt) + return joinConds, filterConds + } + s.propagateConstantEQ() + s.propagateColumnEQ() + s.joinConds = propagateConstantDNF(s.ctx, s.joinConds) + s.filterConds = propagateConstantDNF(s.ctx, s.filterConds) + return s.joinConds, s.filterConds +} + +// propagateConstantDNF find DNF item from CNF, and propagate constant inside DNF. +func propagateConstantDNF(ctx sessionctx.Context, conds []Expression) []Expression { + for i, cond := range conds { + if dnf, ok := cond.(*ScalarFunction); ok && dnf.FuncName.L == ast.LogicOr { + dnfItems := SplitDNFItems(cond) + for j, item := range dnfItems { + dnfItems[j] = ComposeCNFCondition(ctx, PropagateConstant(ctx, []Expression{item})...) + } + conds[i] = ComposeDNFCondition(ctx, dnfItems...) + } + } + return conds +} + +// PropConstOverOuterJoin propagate constant equal and column equal conditions over outer join. +// First step is to extract `outerCol = const` from join conditions and filter conditions, +// and substitute `outerCol` in join conditions with `const`; +// Second step is to extract `outerCol = innerCol` from join conditions, and derive new join +// conditions based on this column equal condition and `outerCol` related +// expressions in join conditions and filter conditions; +func PropConstOverOuterJoin(ctx sessionctx.Context, joinConds, filterConds []Expression, outerSchema, innerSchema *Schema) ([]Expression, []Expression) { + solver := &propOuterJoinConstSolver{ + outerSchema: outerSchema, + innerSchema: innerSchema, + } + solver.colMapper = make(map[int64]int) + solver.ctx = ctx + return solver.solve(joinConds, filterConds) } diff --git a/expression/constant_propagation_test.go b/expression/constant_propagation_test.go new file mode 100644 index 0000000000000..a9d2b49ff9e19 --- /dev/null +++ b/expression/constant_propagation_test.go @@ -0,0 +1,258 @@ +// 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 expression_test + +import ( + "fmt" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testleak" +) + +var _ = Suite(&testSuite{}) + +type testSuite struct { + store kv.Storage + dom *domain.Domain + ctx sessionctx.Context +} + +func (s *testSuite) cleanEnv(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + r := tk.MustQuery("show tables") + for _, tb := range r.Rows() { + tableName := tb[0] + tk.MustExec(fmt.Sprintf("drop table %v", tableName)) + } +} + +func (s *testSuite) SetUpSuite(c *C) { + var err error + testleak.BeforeTest() + s.store, s.dom, err = newStoreWithBootstrap() + c.Assert(err, IsNil) + s.ctx = mock.NewContext() +} + +func (s *testSuite) TearDownSuite(c *C) { + s.dom.Close() + s.store.Close() + testleak.AfterTest(c)() +} + +func (s *testSuite) TestOuterJoinPropConst(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1(id bigint primary key, a int, b int);") + tk.MustExec("create table t2(id bigint primary key, a int, b int);") + + // Positive tests. + tk.MustQuery("explain select * from t1 left join t2 on t1.a > t2.a and t1.a = 1;").Check(testkit.Rows( + "HashLeftJoin_6 33233333.33 root left outer join, inner:TableReader_11, left cond:[eq(test.t1.a, 1)]", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 3323.33 root data:Selection_10", + " └─Selection_10 3323.33 cop gt(1, test.t2.a)", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a > t2.a where t1.a = 1;").Check(testkit.Rows( + "HashLeftJoin_7 33233.33 root left outer join, inner:TableReader_13", + "├─TableReader_10 10.00 root data:Selection_9", + "│ └─Selection_9 10.00 cop eq(test.t1.a, 1)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_13 3323.33 root data:Selection_12", + " └─Selection_12 3323.33 cop gt(1, test.t2.a)", + " └─TableScan_11 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a = t2.a and t1.a > 1;").Check(testkit.Rows( + "HashLeftJoin_6 10000.00 root left outer join, inner:TableReader_11, equal:[eq(test.t1.a, test.t2.a)], left cond:[gt(test.t1.a, 1)]", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 3333.33 root data:Selection_10", + " └─Selection_10 3333.33 cop gt(test.t2.a, 1)", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a = t2.a where t1.a > 1;").Check(testkit.Rows( + "HashLeftJoin_7 4166.67 root left outer join, inner:TableReader_13, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader_10 3333.33 root data:Selection_9", + "│ └─Selection_9 3333.33 cop gt(test.t1.a, 1)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_13 3333.33 root data:Selection_12", + " └─Selection_12 3333.33 cop gt(test.t2.a, 1)", + " └─TableScan_11 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 right join t2 on t1.a > t2.a where t2.a = 1;").Check(testkit.Rows( + "HashRightJoin_7 33333.33 root right outer join, inner:TableReader_10", + "├─TableReader_10 3333.33 root data:Selection_9", + "│ └─Selection_9 3333.33 cop gt(test.t1.a, 1)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_13 10.00 root data:Selection_12", + " └─Selection_12 10.00 cop eq(test.t2.a, 1)", + " └─TableScan_11 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 right join t2 on t1.a = t2.a where t2.a > 1;").Check(testkit.Rows( + "HashRightJoin_7 4166.67 root right outer join, inner:TableReader_10, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader_10 3333.33 root data:Selection_9", + "│ └─Selection_9 3333.33 cop gt(test.t1.a, 1)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_13 3333.33 root data:Selection_12", + " └─Selection_12 3333.33 cop gt(test.t2.a, 1)", + " └─TableScan_11 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 right join t2 on t1.a = t2.a and t2.a > 1;").Check(testkit.Rows( + "HashRightJoin_6 10000.00 root right outer join, inner:TableReader_9, equal:[eq(test.t1.a, test.t2.a)], right cond:gt(test.t2.a, 1)", + "├─TableReader_9 3333.33 root data:Selection_8", + "│ └─Selection_8 3333.33 cop gt(test.t1.a, 1)", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 10000.00 root data:TableScan_10", + " └─TableScan_10 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 right join t2 on t1.a > t2.a and t2.a = 1;").Check(testkit.Rows( + "HashRightJoin_6 33333333.33 root right outer join, inner:TableReader_9, right cond:eq(test.t2.a, 1)", + "├─TableReader_9 3333.33 root data:Selection_8", + "│ └─Selection_8 3333.33 cop gt(test.t1.a, 1)", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 10000.00 root data:TableScan_10", + " └─TableScan_10 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + // Negative tests. + tk.MustQuery("explain select * from t1 left join t2 on t1.a = t2.a and t2.a > 1;").Check(testkit.Rows( + "HashLeftJoin_6 10000.00 root left outer join, inner:TableReader_11, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 3333.33 root data:Selection_10", + " └─Selection_10 3333.33 cop gt(test.t2.a, 1)", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a > t2.a and t2.a = 1;").Check(testkit.Rows( + "HashLeftJoin_6 100000.00 root left outer join, inner:TableReader_11, other cond:gt(test.t1.a, test.t2.a)", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 10.00 root data:Selection_10", + " └─Selection_10 10.00 cop eq(test.t2.a, 1)", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 right join t2 on t1.a > t2.a and t1.a = 1;").Check(testkit.Rows( + "HashRightJoin_6 100000.00 root right outer join, inner:TableReader_9, other cond:gt(test.t1.a, test.t2.a)", + "├─TableReader_9 10.00 root data:Selection_8", + "│ └─Selection_8 10.00 cop eq(test.t1.a, 1)", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 10000.00 root data:TableScan_10", + " └─TableScan_10 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 right join t2 on t1.a = t2.a and t1.a > 1;").Check(testkit.Rows( + "HashRightJoin_6 10000.00 root right outer join, inner:TableReader_9, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader_9 3333.33 root data:Selection_8", + "│ └─Selection_8 3333.33 cop gt(test.t1.a, 1)", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 10000.00 root data:TableScan_10", + " └─TableScan_10 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a = t1.b and t1.a > 1;").Check(testkit.Rows( + "HashLeftJoin_6 100000000.00 root left outer join, inner:TableReader_10, left cond:[eq(test.t1.a, test.t1.b) gt(test.t1.a, 1)]", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_10 10000.00 root data:TableScan_9", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on t2.a = t2.b and t2.a > 1;").Check(testkit.Rows( + "HashLeftJoin_6 26666666.67 root left outer join, inner:TableReader_11", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 2666.67 root data:Selection_10", + " └─Selection_10 2666.67 cop eq(test.t2.a, test.t2.b), gt(test.t2.a, 1)", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + // Constant equal condition merge in outer join. + tk.MustQuery("explain select * from t1 left join t2 on true where t1.a = 1 and false;").Check(testkit.Rows( + "TableDual_8 0.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on true where t1.a = 1 and null;").Check(testkit.Rows( + "TableDual_8 0.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on true where t1.a = null;").Check(testkit.Rows( + "TableDual_8 0.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on true where t1.a = 1 and t1.a = 2;").Check(testkit.Rows( + "TableDual_8 0.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on true where t1.a = 1 and t1.a = 1;").Check(testkit.Rows( + "HashLeftJoin_7 80000.00 root left outer join, inner:TableReader_12", + "├─TableReader_10 10.00 root data:Selection_9", + "│ └─Selection_9 10.00 cop eq(test.t1.a, 1), eq(test.t1.a, 1)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_12 10000.00 root data:TableScan_11", + " └─TableScan_11 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on false;").Check(testkit.Rows( + "HashLeftJoin_6 80000000.00 root left outer join, inner:TableDual_9", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableDual_9 8000.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a =1 and t1.a = 2;").Check(testkit.Rows( + "HashLeftJoin_6 80000000.00 root left outer join, inner:TableDual_9", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableDual_9 8000.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on t1.a =1 where t1.a = 2;").Check(testkit.Rows( + "HashLeftJoin_7 80000.00 root left outer join, inner:TableDual_11", + "├─TableReader_10 10.00 root data:Selection_9", + "│ └─Selection_9 10.00 cop eq(test.t1.a, 2)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableDual_11 8000.00 root rows:0", + )) + tk.MustQuery("explain select * from t1 left join t2 on t2.a = 1 and t2.a = 2;").Check(testkit.Rows( + "HashLeftJoin_6 0.00 root left outer join, inner:TableReader_11", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_11 0.00 root data:Selection_10", + " └─Selection_10 0.00 cop eq(test.t2.a, 1), eq(test.t2.a, 2)", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + // Constant propagation for DNF in outer join. + tk.MustQuery("explain select * from t1 left join t2 on t1.a = 1 or (t1.a = 2 and t1.a = 3);").Check(testkit.Rows( + "HashLeftJoin_6 100000000.00 root left outer join, inner:TableReader_10, left cond:[or(eq(test.t1.a, 1), 0)]", + "├─TableReader_8 10000.00 root data:TableScan_7", + "│ └─TableScan_7 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_10 10000.00 root data:TableScan_9", + " └─TableScan_9 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + tk.MustQuery("explain select * from t1 left join t2 on true where t1.a = 1 or (t1.a = 2 and t1.a = 3);").Check(testkit.Rows( + "HashLeftJoin_7 80000.00 root left outer join, inner:TableReader_12", + "├─TableReader_10 10.00 root data:Selection_9", + "│ └─Selection_9 10.00 cop or(eq(test.t1.a, 1), 0)", + "│ └─TableScan_8 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + "└─TableReader_12 10000.00 root data:TableScan_11", + " └─TableScan_11 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) + // Constant propagation over left outer semi join, filter with aux column should be be derived. + tk.MustQuery("explain select * from t1 where t1.b > 1 or t1.b in (select b from t2);").Check(testkit.Rows( + "Projection_7 8000.00 root test.t1.id, test.t1.a, test.t1.b", + "└─Selection_8 8000.00 root or(gt(test.t1.b, 1), 5_aux_0)", + " └─HashLeftJoin_9 10000.00 root left outer semi join, inner:TableReader_13, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader_11 10000.00 root data:TableScan_10", + " │ └─TableScan_10 10000.00 cop table:t1, range:[-inf,+inf], keep order:false, stats:pseudo", + " └─TableReader_13 10000.00 root data:TableScan_12", + " └─TableScan_12 10000.00 cop table:t2, range:[-inf,+inf], keep order:false, stats:pseudo", + )) +} diff --git a/expression/constant_test.go b/expression/constant_test.go index a2f4376afeeb2..e864c6e3a4fbb 100644 --- a/expression/constant_test.go +++ b/expression/constant_test.go @@ -19,9 +19,9 @@ import ( "strings" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" @@ -202,3 +202,31 @@ func (*testExpressionSuite) TestConstantFolding(c *C) { c.Assert(newConds.String(), Equals, tt.result, Commentf("different for expr %s", tt.condition)) } } + +func (*testExpressionSuite) TestDeferredExprNullConstantFold(c *C) { + defer testleak.AfterTest(c)() + nullConst := &Constant{ + Value: types.NewDatum(nil), + RetType: types.NewFieldType(mysql.TypeTiny), + DeferredExpr: Null, + } + tests := []struct { + condition Expression + deferred string + }{ + { + condition: newFunction(ast.LT, newColumn(0), nullConst), + deferred: "lt(test.t.0, )", + }, + } + for _, tt := range tests { + comment := Commentf("different for expr %s", tt.condition) + sf, ok := tt.condition.(*ScalarFunction) + c.Assert(ok, IsTrue, comment) + sf.GetCtx().GetSessionVars().StmtCtx.InNullRejectCheck = true + newConds := FoldConstant(tt.condition) + newConst, ok := newConds.(*Constant) + c.Assert(ok, IsTrue, comment) + c.Assert(newConst.DeferredExpr.String(), Equals, tt.deferred, comment) + } +} diff --git a/expression/distsql_builtin.go b/expression/distsql_builtin.go index c2df220d869bf..7d90ff1db72af 100644 --- a/expression/distsql_builtin.go +++ b/expression/distsql_builtin.go @@ -17,8 +17,8 @@ import ( "fmt" "time" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" diff --git a/expression/distsql_builtin_test.go b/expression/distsql_builtin_test.go index 2df78ca40fe9b..25162e2edcdf2 100644 --- a/expression/distsql_builtin_test.go +++ b/expression/distsql_builtin_test.go @@ -17,7 +17,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/errors.go b/expression/errors.go index 0de8f48eb3d05..1925b0b025989 100644 --- a/expression/errors.go +++ b/expression/errors.go @@ -14,9 +14,9 @@ package expression import ( - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" ) diff --git a/expression/evaluator_test.go b/expression/evaluator_test.go index 95999a46b6615..67b5bfc98d6d4 100644 --- a/expression/evaluator_test.go +++ b/expression/evaluator_test.go @@ -18,13 +18,14 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" @@ -545,25 +546,41 @@ func (s *testEvaluatorSuite) TestExtract(c *C) { func (s *testEvaluatorSuite) TestLike(c *C) { defer testleak.AfterTest(c)() - tests := []struct { + + lowerCaseTableNamesValues := []string{"0", "2"} + + caseTests := [2][]struct { input string pattern string match int }{ - {"a", "", 0}, - {"a", "a", 1}, - {"a", "b", 0}, - {"aA", "Aa", 0}, - {"aAb", `Aa%`, 0}, - {"aAb", "aA_", 1}, - } - for _, tt := range tests { - fc := funcs[ast.Like] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tt.input, tt.pattern, 0))) - c.Assert(err, IsNil) - r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.match)) + { + {"a", "", 0}, + {"a", "a", 1}, + {"a", "b", 0}, + {"aA", "Aa", 0}, + {"aAb", `Aa%`, 0}, + {"aAb", "aA_", 1}, + }, { + {"a", "", 0}, + {"a", "a", 1}, + {"a", "b", 0}, + {"aA", "Aa", 1}, + {"aAb", `Aa%`, 1}, + {"aAb", "aA_", 1}, + }} + + for index, lowerCaseTableNamesValue := range lowerCaseTableNamesValues { + variable.SysVars["lower_case_table_names"].Value = lowerCaseTableNamesValue + tests := &caseTests[index] + for _, tt := range *tests { + fc := funcs[ast.Like] + f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tt.input, tt.pattern, 0))) + c.Assert(err, IsNil) + r, err := evalBuiltinFunc(f, chunk.Row{}) + c.Assert(err, IsNil) + c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.match)) + } } } diff --git a/expression/expr_to_pb.go b/expression/expr_to_pb.go index 6dee4893ba66c..1e5384c60de6a 100644 --- a/expression/expr_to_pb.go +++ b/expression/expr_to_pb.go @@ -16,13 +16,13 @@ package expression import ( "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tipb/go-tipb" diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index a4d96e571411d..edd06d9b3dcd3 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -17,11 +17,11 @@ import ( "encoding/json" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/mock" ) diff --git a/expression/expression.go b/expression/expression.go index 072bc5a62f1bf..5d6fa3a276723 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -17,12 +17,12 @@ import ( goJSON "encoding/json" "fmt" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/expression_test.go b/expression/expression_test.go index 0fe3b7da63bd5..d96135617bc7f 100644 --- a/expression/expression_test.go +++ b/expression/expression_test.go @@ -17,9 +17,9 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/function_traits.go b/expression/function_traits.go index ae3f4b05ea888..8d8913fd354d4 100644 --- a/expression/function_traits.go +++ b/expression/function_traits.go @@ -14,7 +14,7 @@ package expression import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" ) // UnCacheableFunctions stores functions which can not be cached to plan cache. diff --git a/expression/function_traits_test.go b/expression/function_traits_test.go index 13982d9e85907..11a21da4beb65 100644 --- a/expression/function_traits_test.go +++ b/expression/function_traits_test.go @@ -15,7 +15,7 @@ package expression import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/util/testleak" ) diff --git a/expression/helper.go b/expression/helper.go index fe193651712a1..7759d944b756b 100644 --- a/expression/helper.go +++ b/expression/helper.go @@ -18,12 +18,13 @@ import ( "strings" "time" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pkg/errors" ) @@ -74,7 +75,7 @@ func GetTimeValue(ctx sessionctx.Context, v interface{}, tp byte, fsp int) (d ty return d, errors.Trace(err) } } - case *ast.ValueExpr: + case *driver.ValueExpr: switch x.Kind() { case types.KindString: value, err = types.ParseTime(sc, x.GetString(), tp, fsp) diff --git a/expression/helper_test.go b/expression/helper_test.go index f63109a5a28e6..e0acecfdf817b 100644 --- a/expression/helper_test.go +++ b/expression/helper_test.go @@ -18,9 +18,9 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" diff --git a/expression/integration_test.go b/expression/integration_test.go index d2e0dc125767c..0fc2c2151149d 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -21,19 +21,19 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" @@ -477,6 +477,8 @@ func (s *testIntegrationSuite) TestMathBuiltin(c *C) { result.Check(testkit.Rows("100 123 123 120")) result = tk.MustQuery("SELECT truncate(123.456, -2), truncate(123.456, 2), truncate(123.456, 1), truncate(123.456, 3), truncate(1.23, 100), truncate(123456E-3, 2);") result.Check(testkit.Rows("100 123.45 123.4 123.456 1.230000000000000000000000000000 123.45")) + result = tk.MustQuery("SELECT truncate(9223372036854775807, -7), truncate(9223372036854775808, -10), truncate(cast(-1 as unsigned), -10);") + result.Check(testkit.Rows("9223372036850000000 9223372030000000000 18446744070000000000")) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a date, b datetime, c timestamp, d varchar(20));`) @@ -2300,7 +2302,7 @@ func (s *testIntegrationSuite) TestBuiltin(c *C) { likeTests := []testCase{ {"a", "a", 1}, {"a", "b", 0}, - {"aA", "Aa", 0}, + {"aA", "Aa", 1}, {`aA%`, "aAab", 1}, {"aA_", "Aaab", 0}, {"Aa_", "Aab", 1}, @@ -2387,13 +2389,13 @@ func (s *testIntegrationSuite) TestInfoBuiltin(c *C) { // for current_user sessionVars := tk.Se.GetSessionVars() originUser := sessionVars.User - sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} + sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost", AuthUsername: "root", AuthHostname: "127.0.%%"} result = tk.MustQuery("select current_user()") - result.Check(testkit.Rows("root@localhost")) + result.Check(testkit.Rows("root@127.0.%%")) sessionVars.User = originUser // for user - sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} + sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost", AuthUsername: "root", AuthHostname: "127.0.%%"} result = tk.MustQuery("select user()") result.Check(testkit.Rows("root@localhost")) sessionVars.User = originUser @@ -3367,6 +3369,15 @@ func (s *testIntegrationSuite) TestFuncJSON(c *C) { `) r.Check(testkit.Rows("1 0 1 0")) + r = tk.MustQuery(`select + + json_keys('{}'), + json_keys('{"a": 1, "b": 2}'), + json_keys('{"a": {"c": 3}, "b": 2}'), + json_keys('{"a": {"c": 3}, "b": 2}', "$.a") + `) + r.Check(testkit.Rows(`[] ["a", "b"] ["a", "b"] ["c"]`)) + r = tk.MustQuery(`select json_length('1'), json_length('{}'), diff --git a/expression/scalar_function.go b/expression/scalar_function.go index 34f0d7673e7ec..7705c2ff48b08 100644 --- a/expression/scalar_function.go +++ b/expression/scalar_function.go @@ -17,12 +17,12 @@ import ( "bytes" "fmt" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/expression/scalar_function_test.go b/expression/scalar_function_test.go index f4088c2b010c1..ef466355c1f53 100644 --- a/expression/scalar_function_test.go +++ b/expression/scalar_function_test.go @@ -17,9 +17,9 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/schema.go b/expression/schema.go index ffa41b72498d9..50cdb9d6b4dbf 100644 --- a/expression/schema.go +++ b/expression/schema.go @@ -16,7 +16,7 @@ package expression import ( "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pkg/errors" ) diff --git a/expression/schema_test.go b/expression/schema_test.go index d28a41d7263f7..6ea5de276245b 100644 --- a/expression/schema_test.go +++ b/expression/schema_test.go @@ -17,7 +17,7 @@ import ( "fmt" . "github.com/pingcap/check" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/model" ) // generateKeys4Schema will generate keys for a given schema. Used only in this file. diff --git a/expression/simple_rewriter.go b/expression/simple_rewriter.go index 70ef1e6541321..fd57d166bb4a6 100644 --- a/expression/simple_rewriter.go +++ b/expression/simple_rewriter.go @@ -14,13 +14,14 @@ package expression import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pkg/errors" ) @@ -118,7 +119,7 @@ func (sr *simpleRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok boo return originInNode, false } sr.push(column) - case *ast.ValueExpr: + case *driver.ValueExpr: value := &Constant{Value: v.Datum, RetType: &v.Type} sr.push(value) case *ast.FuncCallExpr: @@ -148,10 +149,10 @@ func (sr *simpleRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok boo if v.Sel == nil { sr.inToExpression(len(v.List), v.Not, &v.Type) } - case *ast.ParamMarkerExpr: + case *driver.ParamMarkerExpr: tp := types.NewFieldType(mysql.TypeUnspecified) types.DefaultParamTypeForValue(v.GetValue(), tp) - value := &Constant{Value: v.Datum, RetType: tp} + value := &Constant{Value: v.ValueExpr.Datum, RetType: tp} sr.push(value) case *ast.RowExpr: sr.rowToScalarFunc(v) diff --git a/expression/typeinfer_test.go b/expression/typeinfer_test.go index bb86b140d5caf..1517cc674443f 100644 --- a/expression/typeinfer_test.go +++ b/expression/typeinfer_test.go @@ -17,14 +17,14 @@ import ( "math" . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/printer" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" diff --git a/expression/util.go b/expression/util.go index 6d7679b0c0f4f..6bf507fd17e52 100644 --- a/expression/util.go +++ b/expression/util.go @@ -19,11 +19,11 @@ import ( "time" "unicode" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" diff --git a/expression/util_test.go b/expression/util_test.go index 2fdbc067dff9e..7e810180dc264 100644 --- a/expression/util_test.go +++ b/expression/util_test.go @@ -17,8 +17,8 @@ import ( "testing" "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/infoschema/builder.go b/infoschema/builder.go index 85caaee73e17f..2f6b1a6ebc3b8 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -17,9 +17,9 @@ import ( "fmt" "sort" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/perfschema" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index 94469ce7f5c45..79da4b273b2b0 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -17,12 +17,12 @@ import ( "sort" "sync/atomic" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" ) var ( diff --git a/infoschema/infoschema_test.go b/infoschema/infoschema_test.go index 840730638092a..13b4217fcdbf1 100644 --- a/infoschema/infoschema_test.go +++ b/infoschema/infoschema_test.go @@ -18,11 +18,11 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/perfschema" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/types" diff --git a/infoschema/tables.go b/infoschema/tables.go index e1cd952fc9c7e..f7cabdcedcb2d 100644 --- a/infoschema/tables.go +++ b/infoschema/tables.go @@ -19,16 +19,16 @@ import ( "sync" "time" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" ) diff --git a/infoschema/tables_test.go b/infoschema/tables_test.go index 919f7b9a9e0b7..f8228f944993d 100644 --- a/infoschema/tables_test.go +++ b/infoschema/tables_test.go @@ -15,11 +15,11 @@ package infoschema_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/auth" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" ) diff --git a/kv/error.go b/kv/error.go index 68be6b86f04fb..b705165238783 100644 --- a/kv/error.go +++ b/kv/error.go @@ -16,8 +16,8 @@ package kv import ( "strings" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" ) // KV error codes. diff --git a/kv/memdb_buffer.go b/kv/memdb_buffer.go index a4aaf7496ce0f..76b93c355479c 100644 --- a/kv/memdb_buffer.go +++ b/kv/memdb_buffer.go @@ -23,7 +23,7 @@ import ( "github.com/pingcap/goleveldb/leveldb/iterator" "github.com/pingcap/goleveldb/leveldb/memdb" "github.com/pingcap/goleveldb/leveldb/util" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" ) diff --git a/kv/txn.go b/kv/txn.go index 56221f45d3cfe..74c1bd10cf2ce 100644 --- a/kv/txn.go +++ b/kv/txn.go @@ -18,7 +18,7 @@ import ( "math/rand" "time" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "golang.org/x/net/context" diff --git a/kv/union_store_test.go b/kv/union_store_test.go index 6241e853582de..c4e6c400f915a 100644 --- a/kv/union_store_test.go +++ b/kv/union_store_test.go @@ -15,7 +15,7 @@ package kv import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/util/testleak" ) diff --git a/meta/autoid/autoid.go b/meta/autoid/autoid.go index 095b7ba271db4..4c8ba2e189473 100644 --- a/meta/autoid/autoid.go +++ b/meta/autoid/autoid.go @@ -20,10 +20,10 @@ import ( "time" "github.com/cznic/mathutil" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) diff --git a/meta/autoid/autoid_test.go b/meta/autoid/autoid_test.go index 15caebe1cd36d..173466190c53e 100644 --- a/meta/autoid/autoid_test.go +++ b/meta/autoid/autoid_test.go @@ -20,10 +20,10 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/store/mockstore" "github.com/pkg/errors" ) diff --git a/meta/meta.go b/meta/meta.go index 35032ad119d3b..e2fac6203cfbc 100644 --- a/meta/meta.go +++ b/meta/meta.go @@ -24,12 +24,12 @@ import ( "sync" "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/structure" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) diff --git a/meta/meta_test.go b/meta/meta_test.go index 823f71b3e0167..81a987a3fb4ea 100644 --- a/meta/meta_test.go +++ b/meta/meta_test.go @@ -19,8 +19,8 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/util/testleak" "golang.org/x/net/context" diff --git a/metrics/ddl.go b/metrics/ddl.go index b08911b693514..6790e2a52ae13 100644 --- a/metrics/ddl.go +++ b/metrics/ddl.go @@ -93,7 +93,7 @@ var ( CreateDDLInstance = "create_ddl_instance" CreateDDL = "create_ddl" - IsDDLOwner = "is_ddl_owner" + DDLOwner = "owner" DDLCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: "tidb", diff --git a/metrics/server.go b/metrics/server.go index e8417274d2775..c18058f1461eb 100644 --- a/metrics/server.go +++ b/metrics/server.go @@ -16,7 +16,7 @@ package metrics import ( "strconv" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" ) diff --git a/model/model_test.go b/model/model_test.go deleted file mode 100644 index a7cf298adb30d..0000000000000 --- a/model/model_test.go +++ /dev/null @@ -1,307 +0,0 @@ -// 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/tidb/mysql" - "github.com/pingcap/tidb/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/const_test.go b/mysql/const_test.go deleted file mode 100644 index 4ad54fd5df097..0000000000000 --- a/mysql/const_test.go +++ /dev/null @@ -1,321 +0,0 @@ -// 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/error_test.go b/mysql/error_test.go deleted file mode 100644 index a57c548353f7d..0000000000000 --- a/mysql/error_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// 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/type_test.go b/mysql/type_test.go deleted file mode 100644 index a5139b1681819..0000000000000 --- a/mysql/type_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// 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/owner/fail_test.go b/owner/fail_test.go index acc94606441ec..5574c34846014 100644 --- a/owner/fail_test.go +++ b/owner/fail_test.go @@ -23,7 +23,7 @@ import ( "github.com/coreos/etcd/clientv3" gofail "github.com/etcd-io/gofail/runtime" . "github.com/pingcap/check" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/testleak" "golang.org/x/net/context" diff --git a/owner/manager.go b/owner/manager.go index 6ac8d8eac285f..640bb5d571cf6 100644 --- a/owner/manager.go +++ b/owner/manager.go @@ -26,8 +26,8 @@ import ( "github.com/coreos/etcd/clientv3/concurrency" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" "github.com/coreos/etcd/mvcc/mvccpb" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/parser/bench_test.go b/parser/bench_test.go deleted file mode 100644 index b22f811463c56..0000000000000 --- a/parser/bench_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// 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/parser/consistent_test.go b/parser/consistent_test.go deleted file mode 100644 index 3872792130b00..0000000000000 --- a/parser/consistent_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// 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/parser/goyacc/main.go b/parser/goyacc/main.go deleted file mode 100644 index 69da64b733ddb..0000000000000 --- a/parser/goyacc/main.go +++ /dev/null @@ -1,819 +0,0 @@ -// 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/parser/lexer_test.go b/parser/lexer_test.go deleted file mode 100644 index a9a066665c436..0000000000000 --- a/parser/lexer_test.go +++ /dev/null @@ -1,363 +0,0 @@ -// 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/tidb/mysql" - "github.com/pingcap/tidb/util/testleak" -) - -var _ = Suite(&testLexerSuite{}) - -type testLexerSuite struct { -} - -func (s *testLexerSuite) TestTokenID(c *C) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(c)() - table := []testCaseItem{ - {"AT", identifier}, - {"?", paramMarker}, - {"PLACEHOLDER", identifier}, - {"=", eq}, - {".", int('.')}, - } - runTest(c, table) -} - -func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(c)() - table := []testCaseItem{ - {"'", 0}, - {"'fu", 0}, - {"'\\n", 0}, - {"'\\", 0}, - {fmt.Sprintf("%c", 0), invalid}, - } - runTest(c, table) -} diff --git a/parser/opcode/opcode_test.go b/parser/opcode/opcode_test.go deleted file mode 100644 index a4c2821b249f1..0000000000000 --- a/parser/opcode/opcode_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// 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/parser.y b/parser/parser.y deleted file mode 100644 index 1721e01a487ff..0000000000000 --- a/parser/parser.y +++ /dev/null @@ -1,7211 +0,0 @@ -%{ -// 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/tidb/mysql" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/auth" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/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.ParamMarkerExpr{ - Offset: 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.ExprNode)} - } - -LimitOption: - LengthNum - { - $$ = ast.NewValueExpr($1) - } -| paramMarker - { - $$ = &ast.ParamMarkerExpr{ - Offset: 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/parser_test.go b/parser/parser_test.go deleted file mode 100644 index 85d5d7d3ade4f..0000000000000 --- a/parser/parser_test.go +++ /dev/null @@ -1,2457 +0,0 @@ -// 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/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/testleak" - "github.com/pkg/errors" -) - -func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) -} - -var _ = Suite(&testParserSuite{}) - -type testParserSuite struct { -} - -func (s *testParserSuite) TestSimple(c *C) { - defer testleak.AfterTest(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].GetDatum().GetString(), 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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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].GetDatum().GetString(), Equals, "MONTH") - - expr = fields[1].Expr - f, ok = expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.Args[0].GetDatum().GetString(), 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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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.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) { - defer testleak.AfterTest(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) { - defer testleak.AfterTest(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/perfschema/init.go b/perfschema/init.go index 270afe27f94fd..477d60e5aab48 100644 --- a/perfschema/init.go +++ b/perfschema/init.go @@ -14,12 +14,12 @@ package perfschema import ( + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" ) type columnInfo struct { diff --git a/perfschema/perfschema.go b/perfschema/perfschema.go index 2e5c1a8106694..8d017b9e37630 100644 --- a/perfschema/perfschema.go +++ b/perfschema/perfschema.go @@ -14,7 +14,7 @@ package perfschema import ( - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/table" ) diff --git a/perfschema/tables.go b/perfschema/tables.go index 8f89614152cf4..2d925ae2b1b2a 100644 --- a/perfschema/tables.go +++ b/perfschema/tables.go @@ -14,9 +14,9 @@ package perfschema import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" diff --git a/planner/cascades/group.go b/planner/cascades/group.go new file mode 100644 index 0000000000000..c044ec78fea1a --- /dev/null +++ b/planner/cascades/group.go @@ -0,0 +1,72 @@ +// 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 cascades + +import ( + "container/list" + "fmt" +) + +// Group is short for expression group, which is used to store all the +// logically equivalent expressions. It's a set of GroupExpr. +type Group struct { + equivalents *list.List + fingerprints map[string]*list.Element + + explored bool + selfFingerprint string +} + +// NewGroup creates a new Group. +func NewGroup(e *GroupExpr) *Group { + g := &Group{ + equivalents: list.New(), + fingerprints: make(map[string]*list.Element), + } + g.Insert(e) + return g +} + +// FingerPrint returns the unique fingerprint of the group. +func (g *Group) FingerPrint() string { + if g.selfFingerprint == "" { + g.selfFingerprint = fmt.Sprintf("%p", g) + } + return g.selfFingerprint +} + +// Insert a nonexistent group expression. +func (g *Group) Insert(e *GroupExpr) bool { + if g.Exists(e) { + return false + } + newEquiv := g.equivalents.PushBack(e) + g.fingerprints[e.FingerPrint()] = newEquiv + return true +} + +// Delete an existing group expression. +func (g *Group) Delete(e *GroupExpr) { + fingerprint := e.FingerPrint() + if equiv, ok := g.fingerprints[fingerprint]; ok { + g.equivalents.Remove(equiv) + delete(g.fingerprints, fingerprint) + } +} + +// Exists checks whether a group expression existed in a Group. +func (g *Group) Exists(e *GroupExpr) bool { + _, ok := g.fingerprints[e.FingerPrint()] + return ok +} diff --git a/planner/cascades/group_expr.go b/planner/cascades/group_expr.go new file mode 100644 index 0000000000000..cda5bd08927dd --- /dev/null +++ b/planner/cascades/group_expr.go @@ -0,0 +1,53 @@ +// 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 cascades + +import ( + "fmt" + + plannercore "github.com/pingcap/tidb/planner/core" +) + +// GroupExpr is used to store all the logically equivalent expressions which +// have the same root operator. Different from a normal expression, the +// children of a group expression are expression Groups, not expressions. +// Another property of group expression is that the child group references will +// never be changed once the group expression is created. +type GroupExpr struct { + exprNode plannercore.LogicalPlan + children []*Group + explored bool + + selfFingerprint string +} + +// NewGroupExpr creates a GroupExpr based on a logical plan node. +func NewGroupExpr(node plannercore.LogicalPlan) *GroupExpr { + return &GroupExpr{ + exprNode: node, + children: nil, + explored: false, + } +} + +// FingerPrint gets the unique fingerprint of the group expression. +func (e *GroupExpr) FingerPrint() string { + if e.selfFingerprint == "" { + e.selfFingerprint = fmt.Sprintf("%v", e.exprNode.ID()) + for i := range e.children { + e.selfFingerprint += e.children[i].FingerPrint() + } + } + return e.selfFingerprint +} diff --git a/planner/cascades/group_expr_test.go b/planner/cascades/group_expr_test.go new file mode 100644 index 0000000000000..ca111959ee282 --- /dev/null +++ b/planner/cascades/group_expr_test.go @@ -0,0 +1,35 @@ +// 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 cascades + +import ( + . "github.com/pingcap/check" + plannercore "github.com/pingcap/tidb/planner/core" +) + +func (s *testCascadesSuite) TestNewGroupExpr(c *C) { + p := &plannercore.LogicalLimit{} + expr := NewGroupExpr(p) + c.Assert(expr.exprNode, Equals, p) + c.Assert(expr.children, IsNil) + c.Assert(expr.explored, IsFalse) +} + +func (s *testCascadesSuite) TestGroupExprFingerprint(c *C) { + p := &plannercore.LogicalLimit{} + expr := NewGroupExpr(p) + + // we haven't set the id of the created LogicalLimit, so the result is 0. + c.Assert(expr.FingerPrint(), Equals, "0") +} diff --git a/planner/cascades/group_test.go b/planner/cascades/group_test.go new file mode 100644 index 0000000000000..a5eab747aee27 --- /dev/null +++ b/planner/cascades/group_test.go @@ -0,0 +1,87 @@ +// 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 cascades + +import ( + "testing" + + . "github.com/pingcap/check" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/testleak" +) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&testCascadesSuite{}) + +type testCascadesSuite struct { + sctx sessionctx.Context +} + +func (s *testCascadesSuite) SetUpSuite(c *C) { + testleak.BeforeTest() + s.sctx = mock.NewContext() +} + +func (s *testCascadesSuite) TearDownSuite(c *C) { + testleak.AfterTest(c)() +} + +func (s *testCascadesSuite) TestNewGroup(c *C) { + p := &plannercore.LogicalLimit{} + expr := NewGroupExpr(p) + g := NewGroup(expr) + + c.Assert(g.equivalents.Len(), Equals, 1) + c.Assert(g.equivalents.Front().Value.(*GroupExpr), Equals, expr) + c.Assert(len(g.fingerprints), Equals, 1) + c.Assert(g.explored, IsFalse) +} + +func (s *testCascadesSuite) TestGroupInsert(c *C) { + p := &plannercore.LogicalLimit{} + expr := NewGroupExpr(p) + g := NewGroup(expr) + c.Assert(g.Insert(expr), IsFalse) + expr.selfFingerprint = "1" + c.Assert(g.Insert(expr), IsTrue) +} + +func (s *testCascadesSuite) TestGroupDelete(c *C) { + p := &plannercore.LogicalLimit{} + expr := NewGroupExpr(p) + g := NewGroup(expr) + c.Assert(g.equivalents.Len(), Equals, 1) + + g.Delete(expr) + c.Assert(g.equivalents.Len(), Equals, 0) + + g.Delete(expr) + c.Assert(g.equivalents.Len(), Equals, 0) +} + +func (s *testCascadesSuite) TestGroupExists(c *C) { + p := &plannercore.LogicalLimit{} + expr := NewGroupExpr(p) + g := NewGroup(expr) + c.Assert(g.Exists(expr), IsTrue) + + g.Delete(expr) + c.Assert(g.Exists(expr), IsFalse) +} diff --git a/planner/cascades/pattern.go b/planner/cascades/pattern.go new file mode 100644 index 0000000000000..82d703853a786 --- /dev/null +++ b/planner/cascades/pattern.go @@ -0,0 +1,123 @@ +// 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 cascades + +import ( + plannercore "github.com/pingcap/tidb/planner/core" +) + +// Operand is the node of a pattern tree, it represents a logical expression operator. +// Different from logical plan operator which holds the full information about an expression +// operator, Operand only stores the type information. +// An Operand may correspond to a concrete logical plan operator, or it can has special meaning, +// e.g, a placeholder for any logical plan operator. +type Operand int + +const ( + // OperandAny is a placeholder for any Operand. + OperandAny Operand = iota + // OperandJoin for LogicalJoin. + OperandJoin + // OperandAggregation for LogicalAggregation. + OperandAggregation + // OperandProjection for LogicalProjection. + OperandProjection + // OperandSelection for LogicalSelection. + OperandSelection + // OperandApply for LogicalApply. + OperandApply + // OperandMaxOneRow for LogicalMaxOneRow. + OperandMaxOneRow + // OperandTableDual for LogicalTableDual. + OperandTableDual + // OperandDataSource for DataSource. + OperandDataSource + // OperandUnionScan for LogicalUnionScan. + OperandUnionScan + // OperandUnionAll for LogicalUnionAll. + OperandUnionAll + // OperandSort for LogicalSort. + OperandSort + // OperandTopN for LogicalTopN. + OperandTopN + // OperandLock for LogicalLock. + OperandLock + // OperandLimit for LogicalLimit. + OperandLimit + // OperandUnsupported is upper bound of defined Operand yet. + OperandUnsupported +) + +// GetOperand maps logical plan operator to Operand. +func GetOperand(p plannercore.LogicalPlan) (Operand, error) { + switch x := p.(type) { + case *plannercore.LogicalJoin: + return OperandJoin, nil + case *plannercore.LogicalAggregation: + return OperandAggregation, nil + case *plannercore.LogicalProjection: + return OperandProjection, nil + case *plannercore.LogicalSelection: + return OperandSelection, nil + case *plannercore.LogicalApply: + return OperandApply, nil + case *plannercore.LogicalMaxOneRow: + return OperandMaxOneRow, nil + case *plannercore.LogicalTableDual: + return OperandTableDual, nil + case *plannercore.DataSource: + return OperandDataSource, nil + case *plannercore.LogicalUnionScan: + return OperandUnionScan, nil + case *plannercore.LogicalUnionAll: + return OperandUnionAll, nil + case *plannercore.LogicalSort: + return OperandSort, nil + case *plannercore.LogicalTopN: + return OperandTopN, nil + case *plannercore.LogicalLock: + return OperandLock, nil + case *plannercore.LogicalLimit: + return OperandLimit, nil + default: + return OperandUnsupported, plannercore.ErrUnsupportedType.GenWithStack("Unsupported LogicalPlan(%T) for GetOperand", x) + } +} + +// match checks if current Operand matches specified one. +func (o Operand) match(t Operand) bool { + if o == OperandAny || t == OperandAny { + return true + } + if o == t { + return true + } + return false +} + +// Pattern defines the match pattern for a rule. +// It describes a piece of logical expression. +// It's a tree-like structure and each node in the tree is an Operand. +type Pattern struct { + operand Operand + children []*Pattern +} + +// BuildPattern builds a Pattern from Operand and child Patterns. +// Used in GetPattern() of Transformation interface to generate a Pattern. +func BuildPattern(operand Operand, children ...*Pattern) *Pattern { + p := &Pattern{operand: operand} + p.children = children + return p +} diff --git a/planner/core/cache.go b/planner/core/cache.go index b86eae67aecd7..b16a99992a6cf 100644 --- a/planner/core/cache.go +++ b/planner/core/cache.go @@ -17,7 +17,7 @@ import ( "sync/atomic" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/hack" diff --git a/planner/core/cache_test.go b/planner/core/cache_test.go index 66af8cdd4c1f9..2d3ab7ea76010 100644 --- a/planner/core/cache_test.go +++ b/planner/core/cache_test.go @@ -16,7 +16,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/testleak" ) diff --git a/planner/core/cacheable_checker.go b/planner/core/cacheable_checker.go index 26b8f9d6ef4eb..2569bf89567a9 100644 --- a/planner/core/cacheable_checker.go +++ b/planner/core/cacheable_checker.go @@ -14,8 +14,9 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/types/parser_driver" ) // Cacheable checks whether the input ast is cacheable. @@ -52,13 +53,13 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren } case *ast.Limit: if node.Count != nil { - if _, isParamMarker := node.Count.(*ast.ParamMarkerExpr); isParamMarker { + if _, isParamMarker := node.Count.(*driver.ParamMarkerExpr); isParamMarker { checker.cacheable = false return in, true } } if node.Offset != nil { - if _, isParamMarker := node.Offset.(*ast.ParamMarkerExpr); isParamMarker { + if _, isParamMarker := node.Offset.(*driver.ParamMarkerExpr); isParamMarker { checker.cacheable = false return in, true } diff --git a/planner/core/cacheable_checker_test.go b/planner/core/cacheable_checker_test.go index ebb4a7d7e44a9..9b6c1367e3042 100644 --- a/planner/core/cacheable_checker_test.go +++ b/planner/core/cacheable_checker_test.go @@ -15,9 +15,10 @@ package core import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" + "github.com/pingcap/tidb/types/parser_driver" ) var _ = Suite(&testCacheableSuite{}) @@ -66,7 +67,7 @@ func (s *testCacheableSuite) TestCacheable(c *C) { c.Assert(Cacheable(stmt), IsFalse) limitStmt := &ast.Limit{ - Count: &ast.ParamMarkerExpr{}, + Count: &driver.ParamMarkerExpr{}, } stmt = &ast.SelectStmt{ Limit: limitStmt, @@ -74,7 +75,7 @@ func (s *testCacheableSuite) TestCacheable(c *C) { c.Assert(Cacheable(stmt), IsFalse) limitStmt = &ast.Limit{ - Offset: &ast.ParamMarkerExpr{}, + Offset: &driver.ParamMarkerExpr{}, } stmt = &ast.SelectStmt{ Limit: limitStmt, diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index e8621d754e79f..e8d01f3353ef7 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -658,7 +658,7 @@ func (s *testAnalyzeSuite) TestCorrelatedEstimation(c *C) { tk.MustQuery("explain select t.c in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t;"). Check(testkit.Rows( "Projection_11 10.00 root 9_aux_0", - "└─Apply_13 10.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))]", + "└─Apply_13 10.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)]", " ├─TableReader_15 10.00 root data:TableScan_14", " │ └─TableScan_14 10.00 cop table:t, range:[-inf,+inf], keep order:false", " └─StreamAgg_20 1.00 root funcs:count(1)", diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index c9ca1792ace73..30770f0408e4a 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -17,15 +17,18 @@ import ( "bytes" "fmt" "strconv" + "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/util/auth" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/ranger" @@ -64,7 +67,7 @@ type CheckTable struct { Tables []*ast.TableName - GenExprs map[string]expression.Expression + GenExprs map[model.TableColumnID]expression.Expression } // RecoverIndex is used for backfilling corrupted index data. @@ -155,7 +158,7 @@ func (e *Execute) OptimizePreparedPlan(ctx sessionctx.Context, is infoschema.Inf if err != nil { return errors.Trace(err) } - prepared.Params[i].SetDatum(val) + prepared.Params[i].(*driver.ParamMarkerExpr).Datum = val vars.PreparedParams = append(vars.PreparedParams, val) } if prepared.SchemaVersion != is.SchemaMetaVersion() { @@ -410,12 +413,52 @@ type Explain struct { StmtPlan Plan Rows [][]string explainedPlans map[int]bool - PrepareRows func() error + Format string Analyze bool ExecStmt ast.StmtNode ExecPlan Plan } +// prepareSchema prepares explain's result schema. +func (e *Explain) prepareSchema() error { + switch strings.ToLower(e.Format) { + case ast.ExplainFormatROW: + retFields := []string{"id", "count", "task", "operator info"} + if e.Analyze { + retFields = append(retFields, "execution info") + } + schema := expression.NewSchema(make([]*expression.Column, 0, len(retFields))...) + for _, fieldName := range retFields { + schema.Append(buildColumn("", fieldName, mysql.TypeString, mysql.MaxBlobWidth)) + } + e.SetSchema(schema) + case ast.ExplainFormatDOT: + retFields := []string{"dot contents"} + schema := expression.NewSchema(make([]*expression.Column, 0, len(retFields))...) + for _, fieldName := range retFields { + schema.Append(buildColumn("", fieldName, mysql.TypeString, mysql.MaxBlobWidth)) + } + e.SetSchema(schema) + default: + return errors.Errorf("explain format '%s' is not supported now", e.Format) + } + return nil +} + +// RenderResult renders the explain result as specified format. +func (e *Explain) RenderResult() error { + switch strings.ToLower(e.Format) { + case ast.ExplainFormatROW: + e.explainedPlans = map[int]bool{} + e.explainPlanInRowFormat(e.StmtPlan.(PhysicalPlan), "root", "", true) + case ast.ExplainFormatDOT: + e.prepareDotInfo(e.StmtPlan.(PhysicalPlan)) + default: + return errors.Errorf("explain format '%s' is not supported now", e.Format) + } + return nil +} + // explainPlanInRowFormat generates explain information for root-tasks. func (e *Explain) explainPlanInRowFormat(p PhysicalPlan, taskType, indent string, isLastChild bool) { e.prepareOperatorInfo(p, taskType, indent, isLastChild) @@ -448,11 +491,11 @@ func (e *Explain) prepareOperatorInfo(p PhysicalPlan, taskType string, indent st count := string(strconv.AppendFloat([]byte{}, p.statsInfo().RowCount, 'f', 2, 64)) row := []string{e.prettyIdentifier(p.ExplainID(), indent, isLastChild), count, taskType, operatorInfo} if e.Analyze { - runtimeStat := e.ctx.GetSessionVars().StmtCtx.RuntimeStats + runtimeStatsColl := e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl if taskType == "cop" { row = append(row, "") //TODO: wait collect resp from tikv } else { - row = append(row, runtimeStat.GetRuntimeStat(p.ExplainID()).String()) + row = append(row, runtimeStatsColl.Get(p.ExplainID()).String()) } } e.Rows = append(e.Rows, row) diff --git a/planner/core/errors.go b/planner/core/errors.go index 2b4ce819c6cfc..55f01919ddf1f 100644 --- a/planner/core/errors.go +++ b/planner/core/errors.go @@ -14,8 +14,8 @@ package core import ( - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" ) const ( diff --git a/planner/core/exhaust_physical_plans.go b/planner/core/exhaust_physical_plans.go index 23fcd817cea76..e8710d5dfae54 100644 --- a/planner/core/exhaust_physical_plans.go +++ b/planner/core/exhaust_physical_plans.go @@ -16,13 +16,13 @@ package core import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/planner/property" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/ranger" "github.com/pkg/errors" diff --git a/planner/core/explain.go b/planner/core/explain.go index 8e77f2ab0d33d..f4b37efd869d1 100644 --- a/planner/core/explain.go +++ b/planner/core/explain.go @@ -34,6 +34,12 @@ func (p *PhysicalIndexScan) ExplainInfo() string { tblName = p.TableAsName.O } fmt.Fprintf(buffer, "table:%s", tblName) + if p.isPartition { + if pi := p.Table.GetPartitionInfo(); pi != nil { + partitionName := pi.GetNameByID(p.physicalTableID) + fmt.Fprintf(buffer, ", partition:%s", partitionName) + } + } if len(p.Index.Columns) > 0 { buffer.WriteString(", index:") for i, idxCol := range p.Index.Columns { @@ -81,6 +87,12 @@ func (p *PhysicalTableScan) ExplainInfo() string { tblName = p.TableAsName.O } fmt.Fprintf(buffer, "table:%s", tblName) + if p.isPartition { + if pi := p.Table.GetPartitionInfo(); pi != nil { + partitionName := pi.GetNameByID(p.physicalTableID) + fmt.Fprintf(buffer, ", partition:%s", partitionName) + } + } if p.pkCol != nil { fmt.Fprintf(buffer, ", pk col:%s", p.pkCol.ExplainInfo()) } diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 60d1e938b19b7..156cd4e048472 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -17,16 +17,17 @@ import ( "strconv" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" "github.com/pkg/errors" ) @@ -36,7 +37,7 @@ var EvalSubquery func(p PhysicalPlan, is infoschema.InfoSchema, ctx sessionctx.C // evalAstExpr evaluates ast expression directly. func evalAstExpr(ctx sessionctx.Context, expr ast.ExprNode) (types.Datum, error) { - if val, ok := expr.(*ast.ValueExpr); ok { + if val, ok := expr.(*driver.ValueExpr); ok { return val.Datum, nil } b := &PlanBuilder{ @@ -753,10 +754,10 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok switch v := inNode.(type) { case *ast.AggregateFuncExpr, *ast.ColumnNameExpr, *ast.ParenthesesExpr, *ast.WhenClause, *ast.SubqueryExpr, *ast.ExistsSubqueryExpr, *ast.CompareSubqueryExpr, *ast.ValuesExpr: - case *ast.ValueExpr: + case *driver.ValueExpr: value := &expression.Constant{Value: v.Datum, RetType: &v.Type} er.ctxStack = append(er.ctxStack, value) - case *ast.ParamMarkerExpr: + case *driver.ParamMarkerExpr: tp := types.NewFieldType(mysql.TypeUnspecified) types.DefaultParamTypeForValue(v.GetValue(), tp) value := &expression.Constant{Value: v.Datum, RetType: tp} @@ -820,7 +821,7 @@ func datumToConstant(d types.Datum, tp byte) *expression.Constant { return &expression.Constant{Value: d, RetType: types.NewFieldType(tp)} } -func (er *expressionRewriter) getParamExpression(v *ast.ParamMarkerExpr) expression.Expression { +func (er *expressionRewriter) getParamExpression(v *driver.ParamMarkerExpr) expression.Expression { f, err := expression.NewFunction(er.ctx, ast.GetParam, &v.Type, diff --git a/planner/core/expression_test.go b/planner/core/expression_test.go index 71584c1a65cf0..21bd952f0ed9d 100644 --- a/planner/core/expression_test.go +++ b/planner/core/expression_test.go @@ -17,12 +17,12 @@ import ( "fmt" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" "github.com/pingcap/tidb/util/testutil" diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index cbe2a3c26c23f..3c4dde6cd2ce9 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -16,10 +16,10 @@ package core import ( "math" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -184,7 +184,7 @@ func (ds *DataSource) tryToGetMemTask(prop *property.PhysicalProperty) (task tas // tryToGetDualTask will check if the push down predicate has false constant. If so, it will return table dual. func (ds *DataSource) tryToGetDualTask() (task, error) { for _, cond := range ds.pushedDownConds { - if _, ok := cond.(*expression.Constant); ok { + if con, ok := cond.(*expression.Constant); ok && con.DeferredExpr == nil { result, err := expression.EvalBool(ds.ctx, []expression.Expression{cond}, chunk.Row{}) if err != nil { return nil, errors.Trace(err) @@ -427,7 +427,11 @@ func (is *PhysicalIndexScan) initSchema(id int, idx *model.IndexInfo, isDoubleRe for _, col := range idx.Columns { colFound := is.dataSourceSchema.FindColumnByName(col.Name.L) if colFound == nil { - colFound = &expression.Column{ColName: col.Name, UniqueID: is.ctx.GetSessionVars().AllocPlanColumnID()} + colFound = &expression.Column{ + ColName: col.Name, + RetType: &is.Table.Columns[col.Offset].FieldType, + UniqueID: is.ctx.GetSessionVars().AllocPlanColumnID(), + } } else { colFound = colFound.Clone().(*expression.Column) } diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 91d847b588e4b..eb17af6fe781b 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -22,21 +22,22 @@ import ( "unicode" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" "github.com/pkg/errors" ) @@ -471,7 +472,7 @@ func (b *PlanBuilder) buildSelection(p LogicalPlan, where ast.ExprNode, AggMappe } cnfItems := expression.SplitCNFItems(expr) for _, item := range cnfItems { - if con, ok := item.(*expression.Constant); ok { + if con, ok := item.(*expression.Constant); ok && con.DeferredExpr == nil { ret, err := expression.EvalBool(b.ctx, expression.CNFExprs{con}, chunk.Row{}) if err != nil || ret { continue @@ -519,7 +520,7 @@ func (b *PlanBuilder) buildProjectionFieldNameFromExpressions(field *ast.SelectF } innerExpr := getInnerFromParentheses(field.Expr) - valueExpr, isValueExpr := innerExpr.(*ast.ValueExpr) + valueExpr, isValueExpr := innerExpr.(*driver.ValueExpr) // Non-literal: Output as inputed, except that comments need to be removed. if !isValueExpr { @@ -576,6 +577,37 @@ func (b *PlanBuilder) buildProjectionField(id, position int, field *ast.SelectFi } } +func eliminateIfNullOnNotNullCol(p LogicalPlan, expr expression.Expression) expression.Expression { + ds, isDs := p.(*DataSource) + if !isDs { + return expr + } + + scalarExpr, isScalarFunc := expr.(*expression.ScalarFunction) + if !isScalarFunc { + return expr + } + exprChildren := scalarExpr.GetArgs() + for i := 0; i < len(exprChildren); i++ { + exprChildren[i] = eliminateIfNullOnNotNullCol(p, exprChildren[i]) + } + + if scalarExpr.FuncName.L != ast.Ifnull { + return expr + } + colRef, isColRef := exprChildren[0].(*expression.Column) + if !isColRef { + return expr + } + + colInfo := model.FindColumnInfo(ds.Columns, colRef.ColName.L) + if !mysql.HasNotNullFlag(colInfo.Flag) { + return expr + } + + return colRef +} + // buildProjection returns a Projection plan and non-aux columns length. func (b *PlanBuilder) buildProjection(p LogicalPlan, fields []*ast.SelectField, mapper map[*ast.AggregateFuncExpr]int) (LogicalPlan, int, error) { b.optFlag |= flagEliminateProjection @@ -585,6 +617,7 @@ func (b *PlanBuilder) buildProjection(p LogicalPlan, fields []*ast.SelectField, oldLen := 0 for _, field := range fields { newExpr, np, err := b.rewrite(field.Expr, p, mapper, true) + newExpr = eliminateIfNullOnNotNullCol(p, newExpr) if err != nil { return nil, 0, errors.Trace(err) } @@ -679,7 +712,7 @@ func (b *PlanBuilder) buildProjection4Union(u *LogicalUnionAll) { } b.optFlag |= flagEliminateProjection proj := LogicalProjection{Exprs: exprs}.init(b.ctx) - proj.SetSchema(expression.NewSchema(unionCols...)) + proj.SetSchema(u.schema.Clone()) proj.SetChildren(child) u.children[childID] = proj } @@ -819,13 +852,13 @@ func getUintForLimitOffset(sc *stmtctx.StatementContext, val interface{}) (uint6 func extractLimitCountOffset(sc *stmtctx.StatementContext, limit *ast.Limit) (count uint64, offset uint64, err error) { if limit.Count != nil { - count, err = getUintForLimitOffset(sc, limit.Count.GetValue()) + count, err = getUintForLimitOffset(sc, limit.Count.(ast.ValueExpr).GetValue()) if err != nil { return 0, 0, ErrWrongArguments.GenWithStackByArgs("LIMIT") } } if limit.Offset != nil { - offset, err = getUintForLimitOffset(sc, limit.Offset.GetValue()) + offset, err = getUintForLimitOffset(sc, limit.Offset.(ast.ValueExpr).GetValue()) if err != nil { return 0, 0, ErrWrongArguments.GenWithStackByArgs("LIMIT") } @@ -938,7 +971,7 @@ func (a *havingAndOrderbyExprResolver) Enter(n ast.Node) (node ast.Node, skipChi switch n.(type) { case *ast.AggregateFuncExpr: a.inAggFunc = true - case *ast.ParamMarkerExpr, *ast.ColumnNameExpr, *ast.ColumnName: + case *driver.ParamMarkerExpr, *ast.ColumnNameExpr, *ast.ColumnName: case *ast.SubqueryExpr, *ast.ExistsSubqueryExpr: // Enter a new context, skip it. // For example: select sum(c) + c + exists(select c from t) from t; @@ -1120,7 +1153,7 @@ func (g *gbyResolver) Enter(inNode ast.Node) (ast.Node, bool) { switch inNode.(type) { case *ast.SubqueryExpr, *ast.CompareSubqueryExpr, *ast.ExistsSubqueryExpr: return inNode, true - case *ast.ValueExpr, *ast.ColumnNameExpr, *ast.ParenthesesExpr, *ast.ColumnName: + case *driver.ValueExpr, *ast.ColumnNameExpr, *ast.ParenthesesExpr, *ast.ColumnName: default: g.inExpr = true } diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 2b4a4c9687273..484fcd0b8aa7c 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -19,15 +19,15 @@ import ( "testing" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" @@ -335,7 +335,7 @@ func (s *testPlanSuite) TestPredicatePushDown(c *C) { }, { sql: "select * from t ta left outer join t tb on ta.d = tb.d and ta.a > 1 where ta.d = 0", - best: "Join{DataScan(ta)->DataScan(tb)}(ta.d,tb.d)->Projection", + best: "Join{DataScan(ta)->DataScan(tb)}->Projection", }, { sql: "select * from t ta left outer join t tb on ta.d = tb.d and ta.a > 1 where tb.d = 0", @@ -1224,6 +1224,13 @@ func (s *testPlanSuite) TestColumnPruning(c *C) { 3: {"a"}, }, }, + //issue 7833 + { + sql: "drop view if exists v", + ans: map[int][]string{ + 1: {}, + }, + }, } for _, tt := range tests { comment := Commentf("for %s", tt.sql) @@ -1536,11 +1543,11 @@ func (s *testPlanSuite) TestAggPrune(c *C) { }, { sql: "select tt.a, sum(tt.b) from (select a, b from t) tt group by tt.a", - best: "DataScan(t)->Projection->Projection->Projection", + best: "DataScan(t)->Projection->Projection", }, { sql: "select count(1) from (select count(1), a as b from t group by a) tt group by b", - best: "DataScan(t)->Projection->Projection->Projection->Projection", + best: "DataScan(t)->Projection->Projection", }, } for _, tt := range tests { @@ -1551,7 +1558,7 @@ func (s *testPlanSuite) TestAggPrune(c *C) { p, err := BuildLogicalPlan(s.ctx, stmt, s.is) c.Assert(err, IsNil) - p, err = logicalOptimize(flagPredicatePushDown|flagPrunColumns|flagBuildKeyInfo|flagEliminateAgg, p.(LogicalPlan)) + p, err = logicalOptimize(flagPredicatePushDown|flagPrunColumns|flagBuildKeyInfo|flagEliminateAgg|flagEliminateProjection, p.(LogicalPlan)) c.Assert(err, IsNil) c.Assert(ToString(p), Equals, tt.best, comment) } diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 9caedb2b3cea1..b5fae30185ae6 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -16,11 +16,11 @@ package core import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" @@ -333,7 +333,10 @@ func (ds *DataSource) deriveTablePathStats(path *accessPath) (bool, error) { path.countAfterAccess = float64(ds.statisticTable.Count) path.tableFilters = ds.pushedDownConds var pkCol *expression.Column - if ds.tableInfo.PKIsHandle { + columnLen := len(ds.schema.Columns) + if columnLen > 0 && ds.schema.Columns[columnLen-1].ID == model.ExtraHandleID { + pkCol = ds.schema.Columns[columnLen-1] + } else if ds.tableInfo.PKIsHandle { if pkColInfo := ds.tableInfo.GetPkColInfo(); pkColInfo != nil { pkCol = expression.ColInfo2Col(ds.schema.Columns, pkColInfo) } @@ -342,6 +345,7 @@ func (ds *DataSource) deriveTablePathStats(path *accessPath) (bool, error) { path.ranges = ranger.FullIntRange(false) return false, nil } + path.ranges = ranger.FullIntRange(mysql.HasUnsignedFlag(pkCol.RetType.Flag)) if len(ds.pushedDownConds) == 0 { return false, nil diff --git a/planner/core/logical_plans_test.go b/planner/core/logical_plans_test.go index 03e2524da74c4..acda1c36ffbf1 100644 --- a/planner/core/logical_plans_test.go +++ b/planner/core/logical_plans_test.go @@ -17,10 +17,10 @@ import ( "fmt" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index 40b51540bc59a..84469150c29c6 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -16,7 +16,7 @@ package core import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/planner/property" @@ -33,10 +33,10 @@ var AllowCartesianProduct = true const ( flagPrunColumns uint64 = 1 << iota - flagEliminateProjection flagBuildKeyInfo flagDecorrelate flagEliminateAgg + flagEliminateProjection flagMaxMinEliminate flagPredicatePushDown flagPartitionProcessor @@ -46,10 +46,10 @@ const ( var optRuleList = []logicalOptRule{ &columnPruner{}, - &projectionEliminater{}, &buildKeySolver{}, &decorrelateSolver{}, &aggregationEliminator{}, + &projectionEliminater{}, &maxMinEliminator{}, &ppdSolver{}, &partitionProcessor{}, diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index 0386059230822..71532c0aa9508 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -15,10 +15,10 @@ package core_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/planner" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index 53e80699f78ef..05be5e39eee37 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -14,10 +14,10 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" diff --git a/planner/core/plan.go b/planner/core/plan.go index 4ac105b0354b4..80831f63bdd81 100644 --- a/planner/core/plan.go +++ b/planner/core/plan.go @@ -17,7 +17,7 @@ import ( "fmt" "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/sessionctx" diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index 1494052fcd591..258fd5b30bc46 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -14,9 +14,9 @@ package core import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" diff --git a/planner/core/plan_to_pb_test.go b/planner/core/plan_to_pb_test.go index e507be3295f14..fd1ff48291a70 100644 --- a/planner/core/plan_to_pb_test.go +++ b/planner/core/plan_to_pb_test.go @@ -15,9 +15,9 @@ package core import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" "github.com/pingcap/tipb/go-tipb" diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index f54675f142d74..31669ea4f24eb 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -18,17 +18,18 @@ import ( "strings" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/ranger" "github.com/pkg/errors" ) @@ -227,6 +228,9 @@ func (b *PlanBuilder) buildDo(v *ast.DoStmt) (Plan, error) { RetType: expr.GetType(), }) } + if dual.schema == nil { + dual.schema = expression.NewSchema() + } p.SetChildren(dual) p.self = p p.SetSchema(schema) @@ -258,8 +262,8 @@ func (b *PlanBuilder) buildSet(v *ast.SetStmt) (Plan, error) { } if vars.ExtendValue != nil { assign.ExtendValue = &expression.Constant{ - Value: vars.ExtendValue.Datum, - RetType: &vars.ExtendValue.Type, + Value: vars.ExtendValue.(*driver.ValueExpr).Datum, + RetType: &vars.ExtendValue.(*driver.ValueExpr).Type, } } p.VarAssigns = append(p.VarAssigns, assign) @@ -396,7 +400,8 @@ func (b *PlanBuilder) buildPrepare(x *ast.PrepareStmt) Plan { Name: x.Name, } if x.SQLVar != nil { - p.SQLText, _ = x.SQLVar.GetValue().(string) + // TODO: Prepared statement from variable expression do not work as expected. + // p.SQLText, _ = x.SQLVar.GetValue().(string) } else { p.SQLText = x.SQLText } @@ -537,7 +542,7 @@ func (b *PlanBuilder) buildAdmin(as *ast.AdminStmt) (Plan, error) { func (b *PlanBuilder) buildAdminCheckTable(as *ast.AdminStmt) (*CheckTable, error) { p := &CheckTable{Tables: as.Tables} - p.GenExprs = make(map[string]expression.Expression) + p.GenExprs = make(map[model.TableColumnID]expression.Expression, len(p.Tables)) mockTablePlan := LogicalTableDual{}.init(b.ctx) for _, tbl := range p.Tables { @@ -569,8 +574,7 @@ func (b *PlanBuilder) buildAdminCheckTable(as *ast.AdminStmt) (*CheckTable, erro return nil, errors.Trace(err) } expr = expression.BuildCastFunction(b.ctx, expr, colExpr.GetType()) - genColumnName := model.GetTableColumnID(tableInfo, column.ColumnInfo) - p.GenExprs[genColumnName] = expr + p.GenExprs[model.TableColumnID{TableID: tableInfo.ID, ColumnID: column.ColumnInfo.ID}] = expr } } return p, nil @@ -1272,7 +1276,7 @@ func (b *PlanBuilder) buildValuesListOfInsert(insert *ast.InsertStmt, insertPlan } else { expr, err = b.getDefaultValue(affectedValuesCols[j]) } - case *ast.ValueExpr: + case *driver.ValueExpr: expr = &expression.Constant{ Value: x.Datum, RetType: &x.Type, @@ -1496,37 +1500,11 @@ func (b *PlanBuilder) buildExplain(explain *ast.ExplainStmt) (Plan, error) { return nil, ErrUnsupportedType.GenWithStackByArgs(targetPlan) } } - p := &Explain{StmtPlan: pp, Analyze: explain.Analyze, ExecStmt: explain.Stmt, ExecPlan: targetPlan} + p := &Explain{StmtPlan: pp, Analyze: explain.Analyze, Format: explain.Format, ExecStmt: explain.Stmt, ExecPlan: targetPlan} p.ctx = b.ctx - p.PrepareRows = func() error { - switch strings.ToLower(explain.Format) { - case ast.ExplainFormatROW: - retFields := []string{"id", "count", "task", "operator info"} - if explain.Analyze { - retFields = append(retFields, "execution_info") - } - schema := expression.NewSchema(make([]*expression.Column, 0, len(retFields))...) - for _, fieldName := range retFields { - schema.Append(buildColumn("", fieldName, mysql.TypeString, mysql.MaxBlobWidth)) - } - p.SetSchema(schema) - p.explainedPlans = map[int]bool{} - p.explainPlanInRowFormat(p.StmtPlan.(PhysicalPlan), "root", "", true) - if explain.Analyze { - b.ctx.GetSessionVars().StmtCtx.RuntimeStats = nil - } - case ast.ExplainFormatDOT: - retFields := []string{"dot contents"} - schema := expression.NewSchema(make([]*expression.Column, 0, len(retFields))...) - for _, fieldName := range retFields { - schema.Append(buildColumn("", fieldName, mysql.TypeString, mysql.MaxBlobWidth)) - } - p.SetSchema(schema) - p.prepareDotInfo(p.StmtPlan.(PhysicalPlan)) - default: - return errors.Errorf("explain format '%s' is not supported now", explain.Format) - } - return nil + err = p.prepareSchema() + if err != nil { + return nil, err } return p, nil } @@ -1655,20 +1633,20 @@ func buildShowSchema(s *ast.ShowStmt) (schema *expression.Schema) { ftypes = []byte{mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLong, mysql.TypeVarchar, mysql.TypeString, mysql.TypeLonglong} case ast.ShowStatsMeta: - names = []string{"Db_name", "Table_name", "Update_time", "Modify_count", "Row_count"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeDatetime, mysql.TypeLonglong, mysql.TypeLonglong} + names = []string{"Db_name", "Table_name", "Partition_name", "Update_time", "Modify_count", "Row_count"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeDatetime, mysql.TypeLonglong, mysql.TypeLonglong} case ast.ShowStatsHistograms: - names = []string{"Db_name", "Table_name", "Column_name", "Is_index", "Update_time", "Distinct_count", "Null_count", "Avg_col_size"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeDatetime, + names = []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Update_time", "Distinct_count", "Null_count", "Avg_col_size"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeDatetime, mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeDouble} case ast.ShowStatsBuckets: - names = []string{"Db_name", "Table_name", "Column_name", "Is_index", "Bucket_id", "Count", + names = []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Bucket_id", "Count", "Repeats", "Lower_Bound", "Upper_Bound"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeLonglong, + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeVarchar} case ast.ShowStatsHealthy: - names = []string{"Db_name", "Table_name", "Healthy"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} + names = []string{"Db_name", "Table_name", "Partition_name", "Healthy"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} case ast.ShowProfiles: // ShowProfiles is deprecated. names = []string{"Query_ID", "Duration", "Query"} ftypes = []byte{mysql.TypeLong, mysql.TypeDouble, mysql.TypeVarchar} diff --git a/planner/core/planbuilder_test.go b/planner/core/planbuilder_test.go index 6d181b4558b57..037a6173f95f7 100644 --- a/planner/core/planbuilder_test.go +++ b/planner/core/planbuilder_test.go @@ -15,8 +15,8 @@ package core import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" ) var _ = Suite(&testPlanBuilderSuite{}) diff --git a/planner/core/point_get_plan.go b/planner/core/point_get_plan.go index c3dde6f418aa4..340dd31d3dfec 100644 --- a/planner/core/point_get_plan.go +++ b/planner/core/point_get_plan.go @@ -17,15 +17,16 @@ import ( "bytes" "fmt" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tipb/go-tipb" "github.com/pkg/errors" ) @@ -336,9 +337,9 @@ func getNameValuePairs(nvPairs []nameValuePair, expr ast.ExprNode) []nameValuePa } var d types.Datum switch x := binOp.R.(type) { - case *ast.ValueExpr: + case *driver.ValueExpr: d = x.Datum - case *ast.ParamMarkerExpr: + case *driver.ParamMarkerExpr: d = x.Datum } if d.IsNull() { diff --git a/planner/core/prepare_test.go b/planner/core/prepare_test.go index 191780284504a..1a456fbc679b3 100644 --- a/planner/core/prepare_test.go +++ b/planner/core/prepare_test.go @@ -63,3 +63,29 @@ func (s *testPrepareSuite) TestPrepareCache(c *C) { tk.MustQuery("execute stmt5").Check(testkit.Rows("1", "2", "2", "3", "4", "5")) tk.MustQuery("execute stmt5").Check(testkit.Rows("1", "2", "2", "3", "4", "5")) } + +func (s *testPrepareSuite) TestPrepareCacheIndexScan(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + orgCapacity := core.PreparedPlanCacheCapacity + defer func() { + dom.Close() + store.Close() + core.SetPreparedPlanCache(orgEnable) + core.PreparedPlanCacheCapacity = orgCapacity + }() + core.SetPreparedPlanCache(true) + core.PreparedPlanCacheCapacity = 100 + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, primary key (a, b))") + tk.MustExec("insert into t values(1, 1, 2), (1, 2, 3), (1, 3, 3), (2, 1, 2), (2, 2, 3), (2, 3, 3)") + tk.MustExec(`prepare stmt1 from "select a, c from t where a = ? and c = ?"`) + tk.MustExec("set @a=1, @b=3") + // When executing one statement at the first time, we don't use cache, so we need to execute it at least twice to test the cache. + tk.MustQuery("execute stmt1 using @a, @b").Check(testkit.Rows("1 3", "1 3")) + tk.MustQuery("execute stmt1 using @a, @b").Check(testkit.Rows("1 3", "1 3")) +} diff --git a/planner/core/preprocess.go b/planner/core/preprocess.go index d0a17036e1e7f..b4ca94946604f 100644 --- a/planner/core/preprocess.go +++ b/planner/core/preprocess.go @@ -17,15 +17,16 @@ import ( "math" "strings" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" + "github.com/pingcap/tidb/types/parser_driver" "github.com/pkg/errors" ) @@ -95,7 +96,7 @@ func (p *preprocessor) Leave(in ast.Node) (out ast.Node, ok bool) { p.checkContainDotColumn(x) case *ast.DropTableStmt, *ast.AlterTableStmt, *ast.RenameTableStmt: p.inCreateOrDropTable = false - case *ast.ParamMarkerExpr: + case *driver.ParamMarkerExpr: if !p.inPrepare { p.err = parser.ErrSyntax.GenWithStack("syntax error, unexpected '?'") return @@ -134,14 +135,20 @@ func checkAutoIncrementOp(colDef *ast.ColumnDef, num int) (bool, error) { return hasAutoIncrement, nil } for _, op := range colDef.Options[num+1:] { - if op.Tp == ast.ColumnOptionDefaultValue && !op.Expr.GetDatum().IsNull() { - return hasAutoIncrement, errors.Errorf("Invalid default value for '%s'", colDef.Name.Name.O) + if op.Tp == ast.ColumnOptionDefaultValue { + if tmp, ok := op.Expr.(*driver.ValueExpr); ok { + if !tmp.Datum.IsNull() { + return hasAutoIncrement, errors.Errorf("Invalid default value for '%s'", colDef.Name.Name.O) + } + } } } } if colDef.Options[num].Tp == ast.ColumnOptionDefaultValue && len(colDef.Options) != num+1 { - if colDef.Options[num].Expr.GetDatum().IsNull() { - return hasAutoIncrement, nil + if tmp, ok := colDef.Options[num].Expr.(*driver.ValueExpr); ok { + if tmp.Datum.IsNull() { + return hasAutoIncrement, nil + } } for _, op := range colDef.Options[num+1:] { if op.Tp == ast.ColumnOptionAutoIncrement { diff --git a/planner/core/preprocess_test.go b/planner/core/preprocess_test.go index 17deb8a09d48b..fb6b1ae659990 100644 --- a/planner/core/preprocess_test.go +++ b/planner/core/preprocess_test.go @@ -15,14 +15,14 @@ package core_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" "github.com/pkg/errors" diff --git a/planner/core/resolve_indices.go b/planner/core/resolve_indices.go index d11f3c49d453e..b4c7e7898714e 100644 --- a/planner/core/resolve_indices.go +++ b/planner/core/resolve_indices.go @@ -14,8 +14,8 @@ package core import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" ) // ResolveIndices implements Plan interface. diff --git a/planner/core/rule_aggregation_elimination.go b/planner/core/rule_aggregation_elimination.go index f062e74a2f9cd..86cda73c899c9 100644 --- a/planner/core/rule_aggregation_elimination.go +++ b/planner/core/rule_aggregation_elimination.go @@ -16,10 +16,10 @@ package core import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" ) diff --git a/planner/core/rule_aggregation_push_down.go b/planner/core/rule_aggregation_push_down.go index d7bd7a073f53c..910d297757e33 100644 --- a/planner/core/rule_aggregation_push_down.go +++ b/planner/core/rule_aggregation_push_down.go @@ -15,11 +15,11 @@ package core import ( "fmt" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" ) diff --git a/planner/core/rule_build_key_info.go b/planner/core/rule_build_key_info.go index 161ed782d4aa8..92c2e67a99bf0 100644 --- a/planner/core/rule_build_key_info.go +++ b/planner/core/rule_build_key_info.go @@ -14,9 +14,9 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" ) type buildKeySolver struct{} diff --git a/planner/core/rule_column_pruning.go b/planner/core/rule_column_pruning.go index 933c93b206900..b96ed9e76a314 100644 --- a/planner/core/rule_column_pruning.go +++ b/planner/core/rule_column_pruning.go @@ -14,10 +14,10 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" log "github.com/sirupsen/logrus" ) @@ -129,6 +129,15 @@ func (ls *LogicalSort) PruneColumns(parentUsedCols []*expression.Column) { // PruneColumns implements LogicalPlan interface. func (p *LogicalUnionAll) PruneColumns(parentUsedCols []*expression.Column) { + used := getUsedList(parentUsedCols, p.schema) + hasBeenUsed := false + for i := range used { + hasBeenUsed = hasBeenUsed || used[i] + } + if !hasBeenUsed { + parentUsedCols = make([]*expression.Column, len(p.schema.Columns)) + copy(parentUsedCols, p.schema.Columns) + } for _, child := range p.Children() { child.PruneColumns(parentUsedCols) } @@ -167,7 +176,7 @@ func (ds *DataSource) PruneColumns(parentUsedCols []*expression.Column) { // PruneColumns implements LogicalPlan interface. func (p *LogicalTableDual) PruneColumns(parentUsedCols []*expression.Column) { - used := getUsedList(parentUsedCols, p.schema) + used := getUsedList(parentUsedCols, p.Schema()) for i := len(used) - 1; i >= 0; i-- { if !used[i] { p.schema.Columns = append(p.schema.Columns[:i], p.schema.Columns[i+1:]...) diff --git a/planner/core/rule_decorrelate.go b/planner/core/rule_decorrelate.go index 4cb9661e68116..13f6400e42e7b 100644 --- a/planner/core/rule_decorrelate.go +++ b/planner/core/rule_decorrelate.go @@ -16,10 +16,10 @@ package core import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/types" "github.com/pkg/errors" ) diff --git a/planner/core/rule_join_reorder.go b/planner/core/rule_join_reorder.go index 70e39cbaa0494..c6e71192a3940 100644 --- a/planner/core/rule_join_reorder.go +++ b/planner/core/rule_join_reorder.go @@ -16,7 +16,7 @@ package core import ( "sort" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" log "github.com/sirupsen/logrus" diff --git a/planner/core/rule_max_min_eliminate.go b/planner/core/rule_max_min_eliminate.go index 46bc666b371f8..c53cbf091475a 100644 --- a/planner/core/rule_max_min_eliminate.go +++ b/planner/core/rule_max_min_eliminate.go @@ -13,9 +13,9 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/types" ) diff --git a/planner/core/rule_predicate_push_down.go b/planner/core/rule_predicate_push_down.go index a22bc51417837..acfc90340feb3 100644 --- a/planner/core/rule_predicate_push_down.go +++ b/planner/core/rule_predicate_push_down.go @@ -13,10 +13,10 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" ) @@ -109,6 +109,11 @@ func (p *LogicalJoin) PredicatePushDown(predicates []expression.Expression) (ret var leftPushCond, rightPushCond, otherCond, leftCond, rightCond []expression.Expression switch p.JoinType { case LeftOuterJoin, LeftOuterSemiJoin, AntiLeftOuterSemiJoin: + predicates = p.outerJoinPropConst(predicates) + dual := conds2TableDual(p, predicates) + if dual != nil { + return ret, dual + } // Handle where conditions predicates = expression.ExtractFiltersFromDNFs(p.ctx, predicates) // Only derive left where condition, because right where condition cannot be pushed down @@ -121,6 +126,11 @@ func (p *LogicalJoin) PredicatePushDown(predicates []expression.Expression) (ret ret = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) ret = append(ret, rightPushCond...) case RightOuterJoin: + predicates = p.outerJoinPropConst(predicates) + dual := conds2TableDual(p, predicates) + if dual != nil { + return ret, dual + } // Handle where conditions predicates = expression.ExtractFiltersFromDNFs(p.ctx, predicates) // Only derive right where condition, because left where condition cannot be pushed down @@ -413,3 +423,27 @@ func conds2TableDual(p LogicalPlan, conds []expression.Expression) LogicalPlan { } return nil } + +// outerJoinPropConst propagates constant equal and column equal conditions over outer join. +func (p *LogicalJoin) outerJoinPropConst(predicates []expression.Expression) []expression.Expression { + outerTable := p.children[0] + innerTable := p.children[1] + if p.JoinType == RightOuterJoin { + innerTable, outerTable = outerTable, innerTable + } + lenJoinConds := len(p.EqualConditions) + len(p.LeftConditions) + len(p.RightConditions) + len(p.OtherConditions) + joinConds := make([]expression.Expression, 0, lenJoinConds) + for _, equalCond := range p.EqualConditions { + joinConds = append(joinConds, equalCond) + } + joinConds = append(joinConds, p.LeftConditions...) + joinConds = append(joinConds, p.RightConditions...) + joinConds = append(joinConds, p.OtherConditions...) + p.EqualConditions = nil + p.LeftConditions = nil + p.RightConditions = nil + p.OtherConditions = nil + joinConds, predicates = expression.PropConstOverOuterJoin(p.ctx, joinConds, predicates, outerTable.Schema(), innerTable.Schema()) + p.attachOnConds(joinConds) + return predicates +} diff --git a/planner/core/task.go b/planner/core/task.go index a7c0e322e4381..17f2568c465cb 100644 --- a/planner/core/task.go +++ b/planner/core/task.go @@ -17,13 +17,13 @@ import ( "fmt" "math" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" ) // task is a new version of `PhysicalPlanInfo`. It stores cost information for a task. diff --git a/planner/core/trace.go b/planner/core/trace.go index 765ab9d7f0a02..ae879cf885e86 100644 --- a/planner/core/trace.go +++ b/planner/core/trace.go @@ -1,7 +1,7 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" ) // Trace represents a trace plan. diff --git a/planner/core/util.go b/planner/core/util.go index 2fe957687fd78..308344beff531 100644 --- a/planner/core/util.go +++ b/planner/core/util.go @@ -14,7 +14,7 @@ package core import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/expression" ) diff --git a/planner/optimize.go b/planner/optimize.go index 50c2706436107..b17aa11adc8af 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -14,7 +14,7 @@ package planner import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/infoschema" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/privilege" diff --git a/privilege/privilege.go b/privilege/privilege.go index 34c210086c671..0349034bdbbe2 100644 --- a/privilege/privilege.go +++ b/privilege/privilege.go @@ -14,10 +14,10 @@ package privilege import ( - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" ) type keyType int @@ -38,7 +38,7 @@ type Manager interface { // this means any privilege would be OK. RequestVerification(db, table, column string, priv mysql.PrivilegeType) bool // ConnectionVerification verifies user privilege for connection. - ConnectionVerification(user, host string, auth, salt []byte) bool + ConnectionVerification(user, host string, auth, salt []byte) (string, string, bool) // DBIsVisible returns true is the database is visible to current user. DBIsVisible(db string) bool diff --git a/privilege/privileges/cache.go b/privilege/privileges/cache.go index 08974a2374ec9..43bcd6f9f49fc 100644 --- a/privilege/privileges/cache.go +++ b/privilege/privileges/cache.go @@ -20,10 +20,10 @@ import ( "sync/atomic" "time" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" @@ -574,9 +574,11 @@ func (p *MySQLPrivilege) DBIsVisible(user, host, db string) bool { func (p *MySQLPrivilege) showGrants(user, host string) []string { var gs []string + var hasGlobalGrant bool = false // Show global grants for _, record := range p.User { if record.User == user && record.Host == host { + hasGlobalGrant = true g := userPrivToString(record.Privileges) if len(g) > 0 { s := fmt.Sprintf(`GRANT %s ON *.* TO '%s'@'%s'`, g, record.User, record.Host) @@ -586,6 +588,12 @@ func (p *MySQLPrivilege) showGrants(user, host string) []string { } } + // This is a mysql convention. + if len(gs) == 0 && hasGlobalGrant { + s := fmt.Sprintf("GRANT USAGE ON *.* TO '%s'@'%s'", user, host) + gs = append(gs, s) + } + // Show db scope grants for _, record := range p.DB { if record.User == user && record.Host == host { @@ -607,6 +615,7 @@ func (p *MySQLPrivilege) showGrants(user, host string) []string { } } } + return gs } diff --git a/privilege/privileges/cache_test.go b/privilege/privileges/cache_test.go index 723373e80ffa3..a66664c566d29 100644 --- a/privilege/privileges/cache_test.go +++ b/privilege/privileges/cache_test.go @@ -15,9 +15,9 @@ package privileges_test import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" diff --git a/privilege/privileges/privileges.go b/privilege/privileges/privileges.go index 2230a44d7be52..d16d02a668cb1 100644 --- a/privilege/privileges/privileges.go +++ b/privilege/privileges/privileges.go @@ -16,12 +16,12 @@ package privileges import ( "strings" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" log "github.com/sirupsen/logrus" ) @@ -70,50 +70,57 @@ func (p *UserPrivileges) RequestVerification(db, table, column string, priv mysq } // ConnectionVerification implements the Manager interface. -func (p *UserPrivileges) ConnectionVerification(user, host string, authentication, salt []byte) bool { +func (p *UserPrivileges) ConnectionVerification(user, host string, authentication, salt []byte) (u string, h string, success bool) { + if SkipWithGrant { p.user = user p.host = host - return true + success = true + return } mysqlPriv := p.Handle.Get() record := mysqlPriv.connectionVerification(user, host) if record == nil { log.Errorf("Get user privilege record fail: user %v, host %v", user, host) - return false + return } + u = record.User + h = record.Host + pwd := record.Password if len(pwd) != 0 && len(pwd) != mysql.PWDHashLen+1 { log.Errorf("User [%s] password from SystemDB not like a sha1sum", user) - return false + return } // empty password if len(pwd) == 0 && len(authentication) == 0 { p.user = user p.host = host - return true + success = true + return } if len(pwd) == 0 || len(authentication) == 0 { - return false + return } hpwd, err := auth.DecodePassword(pwd) if err != nil { log.Errorf("Decode password string error %v", err) - return false + return } if !auth.CheckScrambledPassword(salt, hpwd, authentication) { - return false + return } p.user = user p.host = host - return true + success = true + return } // DBIsVisible implements the Manager interface. diff --git a/privilege/privileges/privileges_test.go b/privilege/privileges/privileges_test.go index 359114f48570a..326fb81ba8306 100644 --- a/privilege/privileges/privileges_test.go +++ b/privilege/privileges/privileges_test.go @@ -19,14 +19,14 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/testleak" "github.com/pingcap/tidb/util/testutil" "golang.org/x/net/context" @@ -147,6 +147,7 @@ func (s *testPrivilegeSuite) TestCheckTablePrivilege(c *C) { func (s *testPrivilegeSuite) TestShowGrants(c *C) { se := newSession(c, s.store, s.dbName) + ctx, _ := se.(sessionctx.Context) mustExec(c, se, `CREATE USER 'show'@'localhost' identified by '123';`) mustExec(c, se, `GRANT Index ON *.* TO 'show'@'localhost';`) mustExec(c, se, `FLUSH PRIVILEGES;`) @@ -222,16 +223,23 @@ func (s *testPrivilegeSuite) TestShowGrants(c *C) { `GRANT Update ON test.test TO 'show'@'localhost'`} c.Assert(testutil.CompareUnorderedStringSlice(gs, expected), IsTrue) - // Fix a issue that empty privileges is displayed when revoke after grant. - mustExec(c, se, "TRUNCATE TABLE mysql.db") - mustExec(c, se, "TRUNCATE TABLE mysql.user") - mustExec(c, se, "TRUNCATE TABLE mysql.tables_priv") - mustExec(c, se, `GRANT ALL PRIVILEGES ON `+"`"+`te%`+"`"+`.* TO 'show'@'localhost'`) - mustExec(c, se, `REVOKE ALL PRIVILEGES ON `+"`"+`te%`+"`"+`.* FROM 'show'@'localhost'`) + // Expected behavior: Usage still exists after revoking all privileges + mustExec(c, se, `REVOKE ALL PRIVILEGES ON *.* FROM 'show'@'localhost'`) + mustExec(c, se, `REVOKE Select on test.* FROM 'show'@'localhost'`) + mustExec(c, se, `REVOKE ALL ON test1.* FROM 'show'@'localhost'`) + mustExec(c, se, `REVOKE UPDATE on test.test FROM 'show'@'localhost'`) mustExec(c, se, `FLUSH PRIVILEGES;`) gs, err = pc.ShowGrants(se, &auth.UserIdentity{Username: "show", Hostname: "localhost"}) c.Assert(err, IsNil) - // It should not be "GRANT ON `te%`.* to 'show'@'localhost'" + c.Assert(gs, HasLen, 1) + c.Assert(gs[0], Equals, `GRANT USAGE ON *.* TO 'show'@'localhost'`) + + // Usage should not exist after dropping the user + // Which we need privileges to do so! + ctx.GetSessionVars().User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} + mustExec(c, se, `DROP USER 'show'@'localhost'`) + mustExec(c, se, `FLUSH PRIVILEGES;`) + gs, err = pc.ShowGrants(se, &auth.UserIdentity{Username: "show", Hostname: "localhost"}) c.Assert(gs, HasLen, 0) } diff --git a/server/column.go b/server/column.go index 27ca3c23d734e..850b02eb3097c 100644 --- a/server/column.go +++ b/server/column.go @@ -14,7 +14,7 @@ package server import ( - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" ) // ColumnInfo contains information of a column diff --git a/server/conn.go b/server/conn.go index 11f2ebbc89de0..09fe05762c131 100644 --- a/server/conn.go +++ b/server/conn.go @@ -49,14 +49,14 @@ import ( "time" "github.com/opentracing/opentracing-go" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/arena" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/memory" diff --git a/server/conn_stmt.go b/server/conn_stmt.go index dcc160f99ad6b..9a058e506d925 100644 --- a/server/conn_stmt.go +++ b/server/conn_stmt.go @@ -41,7 +41,7 @@ import ( "strconv" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/hack" "github.com/pkg/errors" @@ -175,12 +175,12 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e err = parseStmtArgs(args, stmt.BoundParams(), nullBitmaps, stmt.GetParamsType(), paramValues) if err != nil { - return errors.Trace(err) + return errors.Annotatef(err, "%s", cc.preparedStmt2String(stmtID)) } } rs, err := stmt.Execute(ctx, args...) if err != nil { - return errors.Trace(err) + return errors.Annotatef(err, "%s", cc.preparedStmt2String(stmtID)) } if rs == nil { return errors.Trace(cc.writeOK()) @@ -564,3 +564,11 @@ func (cc *clientConn) handleSetOption(data []byte) (err error) { return errors.Trace(cc.flush()) } + +func (cc *clientConn) preparedStmt2String(stmtID uint32) string { + sv := cc.ctx.GetSessionVars() + if prepared, ok := sv.PreparedStmts[stmtID]; ok { + return prepared.Stmt.Text() + sv.GetExecuteArgumentsInfo() + } + return fmt.Sprintf("prepared statement not found, ID: %d", stmtID) +} diff --git a/server/conn_stmt_test.go b/server/conn_stmt_test.go index d131e39d6f22c..8aae1b6e0b08f 100644 --- a/server/conn_stmt_test.go +++ b/server/conn_stmt_test.go @@ -15,8 +15,8 @@ package server import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/types" ) diff --git a/server/conn_test.go b/server/conn_test.go index 037399dd7dd4a..8e56bad74c9e3 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -19,7 +19,7 @@ import ( "encoding/binary" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" ) type ConnTestSuite struct{} diff --git a/server/driver.go b/server/driver.go index 5a22c92524478..734956b5117e1 100644 --- a/server/driver.go +++ b/server/driver.go @@ -18,9 +18,9 @@ import ( "fmt" "time" + "github.com/pingcap/parser/auth" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "golang.org/x/net/context" ) diff --git a/server/driver_tidb.go b/server/driver_tidb.go index 0824ac2018b18..065a9973cdb8d 100644 --- a/server/driver_tidb.go +++ b/server/driver_tidb.go @@ -18,16 +18,17 @@ import ( "fmt" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -344,7 +345,7 @@ func (tc *TiDBContext) GetSessionVars() *variable.SessionVars { } type tidbResultSet struct { - recordSet ast.RecordSet + recordSet sqlexec.RecordSet columns []*ColumnInfo rows []chunk.Row closed bool diff --git a/server/driver_tidb_test.go b/server/driver_tidb_test.go index 97e7b87b05040..b2dcab0a60b87 100644 --- a/server/driver_tidb_test.go +++ b/server/driver_tidb_test.go @@ -15,11 +15,11 @@ package server import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" ) type tidbResultSetTestSuite struct{} diff --git a/server/http_handler.go b/server/http_handler.go index 5fdebb28d1062..9802b9e84c839 100644 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -30,12 +30,13 @@ import ( "github.com/gorilla/mux" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" @@ -45,7 +46,6 @@ import ( "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pkg/errors" diff --git a/server/http_handler_test.go b/server/http_handler_test.go index 0dc9b279a7100..a43a3b5ddad7a 100644 --- a/server/http_handler_test.go +++ b/server/http_handler_test.go @@ -30,12 +30,12 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" diff --git a/server/http_status.go b/server/http_status.go index c48d1bc342036..5e872582592be 100644 --- a/server/http_status.go +++ b/server/http_status.go @@ -21,9 +21,9 @@ import ( "net/http/pprof" "github.com/gorilla/mux" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/printer" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" @@ -117,7 +117,7 @@ func (s *Server) startHTTPServer() { }) log.Infof("Listening on %v for status and metrics report.", addr) - s.statusServer = &http.Server{Addr: addr, Handler: serverMux} + s.statusServer = &http.Server{Addr: addr, Handler: CorsHandler{handler: serverMux, cfg: s.cfg}} if len(s.cfg.Security.ClusterSSLCA) != 0 { err = s.statusServer.ListenAndServeTLS(s.cfg.Security.ClusterSSLCert, s.cfg.Security.ClusterSSLKey) diff --git a/server/packetio.go b/server/packetio.go index ae16f5d143063..1e95b6a0e2e35 100644 --- a/server/packetio.go +++ b/server/packetio.go @@ -38,8 +38,8 @@ import ( "bufio" "io" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" ) diff --git a/server/server.go b/server/server.go index 9b8e0ecd10d48..51cc6930a6c9d 100644 --- a/server/server.go +++ b/server/server.go @@ -43,11 +43,11 @@ import ( "time" "github.com/blacktear23/go-proxyprotocol" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/server/server_test.go b/server/server_test.go index 796c696d85cf0..a672791aa9eec 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -27,8 +27,8 @@ import ( "github.com/go-sql-driver/mysql" . "github.com/pingcap/check" + tmysql "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" - tmysql "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/printer" log "github.com/sirupsen/logrus" diff --git a/server/statistics_handler.go b/server/statistics_handler.go index 2dd1db833ed7b..40761114073f1 100644 --- a/server/statistics_handler.go +++ b/server/statistics_handler.go @@ -17,8 +17,8 @@ import ( "net/http" "github.com/gorilla/mux" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" ) diff --git a/server/statistics_handler_test.go b/server/statistics_handler_test.go index ce67e3ac6f179..292433e7fd8a4 100644 --- a/server/statistics_handler_test.go +++ b/server/statistics_handler_test.go @@ -153,7 +153,7 @@ func (ds *testDumpStatsSuite) checkData(c *C, path string) { var dbName, tableName string var modifyCount, count int64 var other interface{} - err = rows.Scan(&dbName, &tableName, &other, &modifyCount, &count) + err = rows.Scan(&dbName, &tableName, &other, &other, &modifyCount, &count) dbt.Check(err, IsNil) dbt.Check(dbName, Equals, "tidb") dbt.Check(tableName, Equals, "test") diff --git a/server/tidb_test.go b/server/tidb_test.go index db9c56cd77541..a77668fe6e5bc 100644 --- a/server/tidb_test.go +++ b/server/tidb_test.go @@ -28,11 +28,11 @@ import ( "github.com/go-sql-driver/mysql" . "github.com/pingcap/check" + tmysql "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - tmysql "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pkg/errors" diff --git a/server/util.go b/server/util.go index 352fc9e75c12e..a2d351278fc69 100644 --- a/server/util.go +++ b/server/util.go @@ -39,10 +39,12 @@ import ( "encoding/binary" "io" "math" + "net/http" "strconv" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" @@ -354,3 +356,17 @@ func appendFormatFloat(in []byte, fVal float64, prec, bitSize int) []byte { } return out } + +// CorsHandler adds Cors Header if `cors` config is set. +type CorsHandler struct { + handler http.Handler + cfg *config.Config +} + +func (h CorsHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if h.cfg.Cors != "" { + w.Header().Set("Access-Control-Allow-Origin", h.cfg.Cors) + w.Header().Set("Access-Control-Allow-Methods", "GET") + } + h.handler.ServeHTTP(w, req) +} diff --git a/server/util_test.go b/server/util_test.go index ee6dac5f81ce8..cd18b4c8e98fa 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -15,9 +15,9 @@ package server import ( . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/types" diff --git a/session/bench_test.go b/session/bench_test.go index f19dd711e257f..b68a1bdf76823 100644 --- a/session/bench_test.go +++ b/session/bench_test.go @@ -19,10 +19,10 @@ import ( "testing" "time" - "github.com/pingcap/tidb/ast" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/util/sqlexec" log "github.com/sirupsen/logrus" "golang.org/x/net/context" ) @@ -83,7 +83,7 @@ func prepareJoinBenchData(se Session, colType string, valueFormat string, valueC mustExecute(se, "commit") } -func readResult(ctx context.Context, rs ast.RecordSet, count int) { +func readResult(ctx context.Context, rs sqlexec.RecordSet, count int) { chk := rs.NewChunk() for count > 0 { err := rs.Next(ctx, chk) diff --git a/session/bootstrap.go b/session/bootstrap.go index 62986e734e58f..424779630306a 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -25,12 +25,12 @@ import ( "strings" "time" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/timeutil" "github.com/pkg/errors" diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index cff66c5b1b9bb..e0d96951f43d4 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -17,14 +17,14 @@ import ( "fmt" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/auth" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/auth" + "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/util/testleak" "golang.org/x/net/context" ) @@ -55,7 +55,7 @@ func (s *testBootstrapSuite) TestBootstrap(c *C) { err := r.Next(ctx, chk) c.Assert(err, IsNil) c.Assert(chk.NumRows() == 0, IsFalse) - datums := ast.RowToDatums(chk.GetRow(0), r.Fields()) + datums := statistics.RowToDatums(chk.GetRow(0), r.Fields()) match(c, datums, []byte(`%`), []byte("root"), []byte(""), "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y") c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "anyhost"}, []byte(""), []byte("")), IsTrue) @@ -91,7 +91,7 @@ func (s *testBootstrapSuite) TestBootstrap(c *C) { chk = r.NewChunk() err = r.Next(ctx, chk) c.Assert(err, IsNil) - datums = ast.RowToDatums(chk.GetRow(0), r.Fields()) + datums = statistics.RowToDatums(chk.GetRow(0), r.Fields()) match(c, datums, 3) mustExecSQL(c, se, "drop table if exists t") se.Close() @@ -159,7 +159,7 @@ func (s *testBootstrapSuite) TestBootstrapWithError(c *C) { c.Assert(err, IsNil) c.Assert(chk.NumRows() == 0, IsFalse) row := chk.GetRow(0) - datums := ast.RowToDatums(row, r.Fields()) + datums := statistics.RowToDatums(row, r.Fields()) match(c, datums, []byte(`%`), []byte("root"), []byte(""), "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y") c.Assert(r.Close(), IsNil) diff --git a/session/session.go b/session/session.go index 716eb8eda60b4..1f72f78c6cffe 100644 --- a/session/session.go +++ b/session/session.go @@ -28,16 +28,19 @@ import ( "time" "github.com/ngaut/pools" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "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/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/owner" - "github.com/pingcap/tidb/parser" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/privilege/privileges" @@ -46,13 +49,11 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/auth" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/kvcache" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/timeutil" "github.com/pingcap/tipb/go-binlog" "github.com/pkg/errors" @@ -63,17 +64,17 @@ import ( // Session context type Session interface { sessionctx.Context - Status() uint16 // Flag of current status, such as autocommit. - LastInsertID() uint64 // LastInsertID is the last inserted auto_increment ID. - AffectedRows() uint64 // Affected rows by latest executed stmt. - Execute(context.Context, string) ([]ast.RecordSet, error) // Execute a sql statement. - String() string // String is used to debug. + Status() uint16 // Flag of current status, such as autocommit. + LastInsertID() uint64 // LastInsertID is the last inserted auto_increment ID. + AffectedRows() uint64 // Affected rows by latest executed stmt. + Execute(context.Context, string) ([]sqlexec.RecordSet, error) // Execute a sql statement. + String() string // String is used to debug. CommitTxn(context.Context) error RollbackTxn(context.Context) error // PrepareStmt executes prepare statement in binary protocol. PrepareStmt(sql string) (stmtID uint32, paramCount int, fields []*ast.ResultField, err error) // ExecutePreparedStmt executes a prepared statement. - ExecutePreparedStmt(ctx context.Context, stmtID uint32, param ...interface{}) (ast.RecordSet, error) + ExecutePreparedStmt(ctx context.Context, stmtID uint32, param ...interface{}) (sqlexec.RecordSet, error) DropPreparedStmt(stmtID uint32) error SetClientCapability(uint32) // Set client capability flags. SetConnectionID(uint64) @@ -97,7 +98,7 @@ var ( type stmtRecord struct { stmtID uint32 - st ast.Statement + st sqlexec.Statement stmtCtx *stmtctx.StatementContext params []interface{} } @@ -108,7 +109,7 @@ type StmtHistory struct { } // Add appends a stmt to history list. -func (h *StmtHistory) Add(stmtID uint32, st ast.Statement, stmtCtx *stmtctx.StatementContext, params ...interface{}) { +func (h *StmtHistory) Add(stmtID uint32, st sqlexec.Statement, stmtCtx *stmtctx.StatementContext, params ...interface{}) { s := &stmtRecord{ stmtID: stmtID, st: st, @@ -378,7 +379,13 @@ func (s *session) doCommitWithRetry(ctx context.Context) error { } func (s *session) CommitTxn(ctx context.Context) error { + stmt := executor.ExecStmt{ + Text: "commit", + Ctx: s, + StartTime: time.Now(), + } err := s.doCommitWithRetry(ctx) + stmt.LogSlowQuery(s.sessionVars.TxnCtx.StartTS, err == nil) label := metrics.LblOK if err != nil { label = metrics.LblError @@ -607,7 +614,7 @@ func createSessionWithDomainFunc(store kv.Storage) func(*domain.Domain) (pools.R } } -func drainRecordSet(ctx context.Context, se *session, rs ast.RecordSet) ([]chunk.Row, error) { +func drainRecordSet(ctx context.Context, se *session, rs sqlexec.RecordSet) ([]chunk.Row, error) { var rows []chunk.Row chk := rs.NewChunk() for { @@ -722,7 +729,7 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte) { s.processInfo.Store(pi) } -func (s *session) executeStatement(ctx context.Context, connID uint64, stmtNode ast.StmtNode, stmt ast.Statement, recordSets []ast.RecordSet) ([]ast.RecordSet, error) { +func (s *session) executeStatement(ctx context.Context, connID uint64, stmtNode ast.StmtNode, stmt sqlexec.Statement, recordSets []sqlexec.RecordSet) ([]sqlexec.RecordSet, error) { s.SetValue(sessionctx.QueryString, stmt.OriginText()) if _, ok := stmtNode.(ast.DDLNode); ok { s.SetValue(sessionctx.LastExecuteDDL, true) @@ -751,7 +758,7 @@ func (s *session) executeStatement(ctx context.Context, connID uint64, stmtNode return recordSets, nil } -func (s *session) Execute(ctx context.Context, sql string) (recordSets []ast.RecordSet, err error) { +func (s *session) Execute(ctx context.Context, sql string) (recordSets []sqlexec.RecordSet, err error) { if recordSets, err = s.execute(ctx, sql); err != nil { err = errors.Trace(err) s.sessionVars.StmtCtx.AppendError(err) @@ -759,7 +766,7 @@ func (s *session) Execute(ctx context.Context, sql string) (recordSets []ast.Rec return } -func (s *session) execute(ctx context.Context, sql string) (recordSets []ast.RecordSet, err error) { +func (s *session) execute(ctx context.Context, sql string) (recordSets []sqlexec.RecordSet, err error) { s.PrepareTxnCtx(ctx) connID := s.sessionVars.ConnectionID err = s.loadCommonGlobalVariablesIfNeeded() @@ -902,7 +909,7 @@ func checkArgs(args ...interface{}) error { } // ExecutePreparedStmt executes a prepared statement. -func (s *session) ExecutePreparedStmt(ctx context.Context, stmtID uint32, args ...interface{}) (ast.RecordSet, error) { +func (s *session) ExecutePreparedStmt(ctx context.Context, stmtID uint32, args ...interface{}) (sqlexec.RecordSet, error) { err := checkArgs(args...) if err != nil { return nil, errors.Trace(err) @@ -1002,17 +1009,22 @@ func (s *session) Auth(user *auth.UserIdentity, authentication []byte, salt []by pm := privilege.GetPrivilegeManager(s) // Check IP. - if pm.ConnectionVerification(user.Username, user.Hostname, authentication, salt) { + var success bool + user.AuthUsername, user.AuthHostname, success = pm.ConnectionVerification(user.Username, user.Hostname, authentication, salt) + if success { s.sessionVars.User = user return true } // Check Hostname. for _, addr := range getHostByIP(user.Hostname) { - if pm.ConnectionVerification(user.Username, addr, authentication, salt) { + u, h, success := pm.ConnectionVerification(user.Username, addr, authentication, salt) + if success { s.sessionVars.User = &auth.UserIdentity{ - Username: user.Username, - Hostname: addr, + Username: user.Username, + Hostname: addr, + AuthUsername: u, + AuthHostname: h, } return true } @@ -1276,6 +1288,7 @@ const loadCommonGlobalVarsSQL = "select HIGH_PRIORITY * from mysql.global_variab variable.TiDBHashAggPartialConcurrency + quoteCommaQuote + variable.TiDBHashAggFinalConcurrency + quoteCommaQuote + variable.TiDBBackoffLockFast + quoteCommaQuote + + variable.TiDBConstraintCheckInPlace + quoteCommaQuote + variable.TiDBDDLReorgWorkerCount + quoteCommaQuote + variable.TiDBOptInSubqUnFolding + quoteCommaQuote + variable.TiDBDistSQLScanConcurrency + quoteCommaQuote + diff --git a/session/session_test.go b/session/session_test.go index 30f0f7a745eec..3d87505793f23 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -20,13 +20,15 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/session" @@ -35,9 +37,7 @@ import ( "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/mockstore/mocktikv" "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" diff --git a/session/tidb.go b/session/tidb.go index 1357c3e753f01..5595f52d82bc7 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -23,17 +23,18 @@ import ( "sync" "time" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "golang.org/x/net/context" @@ -134,16 +135,16 @@ func Parse(ctx sessionctx.Context, src string) ([]ast.StmtNode, error) { } // Compile is safe for concurrent use by multiple goroutines. -func Compile(ctx context.Context, sctx sessionctx.Context, stmtNode ast.StmtNode) (ast.Statement, error) { +func Compile(ctx context.Context, sctx sessionctx.Context, stmtNode ast.StmtNode) (sqlexec.Statement, error) { compiler := executor.Compiler{Ctx: sctx} stmt, err := compiler.Compile(ctx, stmtNode) return stmt, errors.Trace(err) } -// runStmt executes the ast.Statement and commit or rollback the current transaction. -func runStmt(ctx context.Context, sctx sessionctx.Context, s ast.Statement) (ast.RecordSet, error) { +// runStmt executes the sqlexec.Statement and commit or rollback the current transaction. +func runStmt(ctx context.Context, sctx sessionctx.Context, s sqlexec.Statement) (sqlexec.RecordSet, error) { var err error - var rs ast.RecordSet + var rs sqlexec.RecordSet se := sctx.(*session) rs, err = s.Exec(ctx) // All the history should be added here. @@ -194,7 +195,7 @@ func GetHistory(ctx sessionctx.Context) *StmtHistory { } // GetRows4Test gets all the rows from a RecordSet, only used for test. -func GetRows4Test(ctx context.Context, sctx sessionctx.Context, rs ast.RecordSet) ([]chunk.Row, error) { +func GetRows4Test(ctx context.Context, sctx sessionctx.Context, rs sqlexec.RecordSet) ([]chunk.Row, error) { if rs == nil { return nil, nil } diff --git a/session/tidb_test.go b/session/tidb_test.go index 1821351008d94..2a631c554baaf 100644 --- a/session/tidb_test.go +++ b/session/tidb_test.go @@ -22,14 +22,14 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/auth" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testleak" "github.com/pkg/errors" "golang.org/x/net/context" @@ -195,7 +195,7 @@ func removeStore(c *C, dbPath string) { os.RemoveAll(dbPath) } -func exec(se Session, sql string, args ...interface{}) (ast.RecordSet, error) { +func exec(se Session, sql string, args ...interface{}) (sqlexec.RecordSet, error) { ctx := context.Background() if len(args) == 0 { rs, err := se.Execute(ctx, sql) @@ -215,7 +215,7 @@ func exec(se Session, sql string, args ...interface{}) (ast.RecordSet, error) { return rs, nil } -func mustExecSQL(c *C, se Session, sql string, args ...interface{}) ast.RecordSet { +func mustExecSQL(c *C, se Session, sql string, args ...interface{}) sqlexec.RecordSet { rs, err := exec(se, sql, args...) c.Assert(err, IsNil) return rs diff --git a/sessionctx/binloginfo/binloginfo.go b/sessionctx/binloginfo/binloginfo.go index acd9ae82dc8d4..4084d4b56354c 100644 --- a/sessionctx/binloginfo/binloginfo.go +++ b/sessionctx/binloginfo/binloginfo.go @@ -20,10 +20,10 @@ import ( "sync/atomic" "time" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" binlog "github.com/pingcap/tipb/go-binlog" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/sessionctx/binloginfo/binloginfo_test.go b/sessionctx/binloginfo/binloginfo_test.go index 8650a9afb1ede..73ca53abfd4d7 100644 --- a/sessionctx/binloginfo/binloginfo_test.go +++ b/sessionctx/binloginfo/binloginfo_test.go @@ -22,6 +22,7 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" @@ -29,7 +30,6 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/logutil" diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index c3739585b1487..66db63081c5b8 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -18,7 +18,7 @@ import ( "sync" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/memory" ) @@ -73,13 +73,13 @@ type StatementContext struct { } // Copied from SessionVars.TimeZone. - TimeZone *time.Location - Priority mysql.PriorityEnum - NotFillCache bool - MemTracker *memory.Tracker - RuntimeStats execdetails.RuntimeStats - TableIDs []int64 - IndexIDs []int64 + TimeZone *time.Location + Priority mysql.PriorityEnum + NotFillCache bool + MemTracker *memory.Tracker + RuntimeStatsColl *execdetails.RuntimeStatsColl + TableIDs []int64 + IndexIDs []int64 } // AddAffectedRows adds affected rows. diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index 2ce0a2fb5a447..784bb8d24f049 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -22,15 +22,15 @@ import ( "time" "github.com/klauspost/cpuid" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/auth" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/timeutil" "github.com/pkg/errors" @@ -308,6 +308,9 @@ type SessionVars struct { // HashJoin. EnableRadixJoin bool + // ConstraintCheckInPlace indicates whether to check the constraint when the SQL executing. + ConstraintCheckInPlace bool + // CommandValue indicates which command current session is doing. CommandValue uint32 } @@ -573,6 +576,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.IndexSerialScanConcurrency = tidbOptPositiveInt32(val, DefIndexSerialScanConcurrency) case TiDBBackoffLockFast: s.KVVars.BackoffLockFast = tidbOptPositiveInt32(val, kv.DefBackoffLockFast) + case TiDBConstraintCheckInPlace: + s.ConstraintCheckInPlace = TiDBOptOn(val) case TiDBBatchInsert: s.BatchInsert = TiDBOptOn(val) case TiDBBatchDelete: diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index b35e91cb8a1e6..00383aa56d860 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -17,11 +17,11 @@ import ( "strconv" "strings" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/charset" ) // ScopeFlag is for system variable whether can be changed in global/session dynamically or not. @@ -658,6 +658,7 @@ var defaultSysVars = []*SysVar{ {ScopeGlobal | ScopeSession, TiDBBackoffLockFast, strconv.Itoa(kv.DefBackoffLockFast)}, {ScopeGlobal | ScopeSession, TiDBRetryLimit, strconv.Itoa(DefTiDBRetryLimit)}, {ScopeGlobal | ScopeSession, TiDBDisableTxnAutoRetry, boolToIntStr(DefTiDBDisableTxnAutoRetry)}, + {ScopeGlobal | ScopeSession, TiDBConstraintCheckInPlace, boolToIntStr(DefTiDBConstraintCheckInPlace)}, {ScopeSession, TiDBOptimizerSelectivityLevel, strconv.Itoa(DefTiDBOptimizerSelectivityLevel)}, /* The following variable is defined as session scope but is actually server scope. */ {ScopeSession, TiDBGeneralLog, strconv.Itoa(DefTiDBGeneralLog)}, diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index bc48d33363bf8..fd2fa6588d7bb 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -16,7 +16,7 @@ package variable import ( "os" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" ) /* @@ -198,6 +198,10 @@ const ( // tidb_enable_radix_join indicates to use radix hash join algorithm to execute // HashJoin. TiDBEnableRadixJoin = "tidb_enable_radix_join" + + // tidb_constraint_check_in_place indicates to check the constraint when the SQL executing. + // It could hurt the performance of bulking insert when it is ON. + TiDBConstraintCheckInPlace = "tidb_constraint_check_in_place" ) // Default TiDB system variable values. @@ -231,6 +235,7 @@ const ( DefTiDBGeneralLog = 0 DefTiDBRetryLimit = 10 DefTiDBDisableTxnAutoRetry = false + DefTiDBConstraintCheckInPlace = false DefTiDBHashJoinConcurrency = 5 DefTiDBProjectionConcurrency = 4 DefTiDBOptimizerSelectivityLevel = 0 diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index b45544288d2a7..db9ac1b427e68 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -22,8 +22,8 @@ import ( "sync/atomic" "time" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/timeutil" "github.com/pkg/errors" @@ -281,7 +281,7 @@ func ValidateSetSystemVar(vars *SessionVars, name string, value string) (string, case WarningCount, ErrorCount: return value, ErrReadOnly.GenWithStackByArgs(name) case GeneralLog, TiDBGeneralLog, AvoidTemporalUpgrade, BigTables, CheckProxyUsers, CoreFile, EndMakersInJSON, SQLLogBin, OfflineMode, - PseudoSlaveMode, LowPriorityUpdates, SkipNameResolve, ForeignKeyChecks, SQLSafeUpdates: + PseudoSlaveMode, LowPriorityUpdates, SkipNameResolve, ForeignKeyChecks, SQLSafeUpdates, TiDBConstraintCheckInPlace: if strings.EqualFold(value, "ON") || value == "1" { return "1", nil } else if strings.EqualFold(value, "OFF") || value == "0" { diff --git a/sessionctx/variable/varsutil_test.go b/sessionctx/variable/varsutil_test.go index b939b18e19e70..147ef678eecd7 100644 --- a/sessionctx/variable/varsutil_test.go +++ b/sessionctx/variable/varsutil_test.go @@ -19,9 +19,9 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testleak" ) diff --git a/statistics/bootstrap.go b/statistics/bootstrap.go index 850ad1a043a71..8a346969f5a31 100644 --- a/statistics/bootstrap.go +++ b/statistics/bootstrap.go @@ -16,11 +16,11 @@ package statistics import ( "fmt" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" diff --git a/statistics/builder.go b/statistics/builder.go index 616716693e59a..4a820240cbf00 100644 --- a/statistics/builder.go +++ b/statistics/builder.go @@ -96,8 +96,12 @@ func (b *SortedBuilder) Iterate(data types.Datum) error { // BuildColumn builds histogram from samples for column. func BuildColumn(ctx sessionctx.Context, numBuckets, id int64, collector *SampleCollector, tp *types.FieldType) (*Histogram, error) { count := collector.Count - if count == 0 { - return &Histogram{ID: id, NullCount: collector.NullCount}, nil + ndv := collector.FMSketch.NDV() + if ndv > count { + ndv = count + } + if count == 0 || len(collector.Samples) == 0 { + return NewHistogram(id, ndv, collector.NullCount, 0, tp, 0, collector.TotalSize), nil } sc := ctx.GetSessionVars().StmtCtx samples := collector.Samples @@ -105,10 +109,6 @@ func BuildColumn(ctx sessionctx.Context, numBuckets, id int64, collector *Sample if err != nil { return nil, errors.Trace(err) } - ndv := collector.FMSketch.NDV() - if ndv > count { - ndv = count - } hg := NewHistogram(id, ndv, collector.NullCount, 0, tp, int(numBuckets), collector.TotalSize) sampleNum := int64(len(samples)) diff --git a/statistics/ddl.go b/statistics/ddl.go index acabf0fd71907..b8cedc71fee1c 100644 --- a/statistics/ddl.go +++ b/statistics/ddl.go @@ -16,11 +16,10 @@ package statistics import ( "fmt" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl/util" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" @@ -31,13 +30,35 @@ import ( func (h *Handle) HandleDDLEvent(t *util.Event) error { switch t.Tp { case model.ActionCreateTable, model.ActionTruncateTable: - return h.insertTableStats2KV(t.TableInfo) + ids := getPhysicalIDs(t.TableInfo) + for _, id := range ids { + if err := h.insertTableStats2KV(t.TableInfo, id); err != nil { + return err + } + } case model.ActionAddColumn: - return h.insertColStats2KV(t.TableInfo.ID, t.ColumnInfo) + ids := getPhysicalIDs(t.TableInfo) + for _, id := range ids { + if err := h.insertColStats2KV(id, t.ColumnInfo); err != nil { + return err + } + } } return nil } +func getPhysicalIDs(tblInfo *model.TableInfo) []int64 { + pi := tblInfo.GetPartitionInfo() + if pi == nil { + return []int64{tblInfo.ID} + } + ids := make([]int64, 0, len(pi.Definitions)) + for _, def := range pi.Definitions { + ids = append(ids, def.ID) + } + return ids +} + // DDLEventCh returns ddl events channel in handle. func (h *Handle) DDLEventCh() chan *util.Event { return h.ddlEventCh @@ -45,7 +66,7 @@ func (h *Handle) DDLEventCh() chan *util.Event { // insertTableStats2KV inserts a record standing for a new table to stats_meta and inserts some records standing for the // new columns and indices which belong to this table. -func (h *Handle) insertTableStats2KV(info *model.TableInfo) (err error) { +func (h *Handle) insertTableStats2KV(info *model.TableInfo, physicalID int64) (err error) { h.mu.Lock() defer h.mu.Unlock() exec := h.mu.ctx.(sqlexec.SQLExecutor) @@ -56,18 +77,18 @@ func (h *Handle) insertTableStats2KV(info *model.TableInfo) (err error) { defer func() { err = finishTransaction(context.Background(), exec, err) }() - _, err = exec.Execute(context.Background(), fmt.Sprintf("insert into mysql.stats_meta (version, table_id) values(%d, %d)", h.mu.ctx.Txn().StartTS(), info.ID)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("insert into mysql.stats_meta (version, table_id) values(%d, %d)", h.mu.ctx.Txn().StartTS(), physicalID)) if err != nil { return } for _, col := range info.Columns { - _, err = exec.Execute(context.Background(), fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%d, 0, %d, 0, %d)", info.ID, col.ID, h.mu.ctx.Txn().StartTS())) + _, err = exec.Execute(context.Background(), fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%d, 0, %d, 0, %d)", physicalID, col.ID, h.mu.ctx.Txn().StartTS())) if err != nil { return } } for _, idx := range info.Indices { - _, err = exec.Execute(context.Background(), fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%d, 1, %d, 0, %d)", info.ID, idx.ID, h.mu.ctx.Txn().StartTS())) + _, err = exec.Execute(context.Background(), fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%d, 1, %d, 0, %d)", physicalID, idx.ID, h.mu.ctx.Txn().StartTS())) if err != nil { return } @@ -77,7 +98,7 @@ func (h *Handle) insertTableStats2KV(info *model.TableInfo) (err error) { // insertColStats2KV insert a record to stats_histograms with distinct_count 1 and insert a bucket to stats_buckets with default value. // This operation also updates version. -func (h *Handle) insertColStats2KV(tableID int64, colInfo *model.ColumnInfo) (err error) { +func (h *Handle) insertColStats2KV(physicalID int64, colInfo *model.ColumnInfo) (err error) { h.mu.Lock() defer h.mu.Unlock() exec := h.mu.ctx.(sqlexec.SQLExecutor) @@ -89,7 +110,7 @@ func (h *Handle) insertColStats2KV(tableID int64, colInfo *model.ColumnInfo) (er err = finishTransaction(context.Background(), exec, err) }() // First of all, we update the version. - _, err = exec.Execute(context.Background(), fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", h.mu.ctx.Txn().StartTS(), tableID)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", h.mu.ctx.Txn().StartTS(), physicalID)) if err != nil { return } @@ -97,8 +118,8 @@ func (h *Handle) insertColStats2KV(tableID int64, colInfo *model.ColumnInfo) (er // If we didn't update anything by last SQL, it means the stats of this table does not exist. if h.mu.ctx.GetSessionVars().StmtCtx.AffectedRows() > 0 { // By this step we can get the count of this table, then we can sure the count and repeats of bucket. - var rs []ast.RecordSet - rs, err = exec.Execute(ctx, fmt.Sprintf("select count from mysql.stats_meta where table_id = %d", tableID)) + var rs []sqlexec.RecordSet + rs, err = exec.Execute(ctx, fmt.Sprintf("select count from mysql.stats_meta where table_id = %d", physicalID)) if len(rs) > 0 { defer terror.Call(rs[0].Close) } @@ -118,13 +139,13 @@ func (h *Handle) insertColStats2KV(tableID int64, colInfo *model.ColumnInfo) (er } if value.IsNull() { // If the adding column has default value null, all the existing rows have null value on the newly added column. - _, err = exec.Execute(ctx, fmt.Sprintf("insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, null_count) values (%d, %d, 0, %d, 0, %d)", h.mu.ctx.Txn().StartTS(), tableID, colInfo.ID, count)) + _, err = exec.Execute(ctx, fmt.Sprintf("insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, null_count) values (%d, %d, 0, %d, 0, %d)", h.mu.ctx.Txn().StartTS(), physicalID, colInfo.ID, count)) if err != nil { return } } else { // If this stats exists, we insert histogram meta first, the distinct_count will always be one. - _, err = exec.Execute(ctx, fmt.Sprintf("insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, tot_col_size) values (%d, %d, 0, %d, 1, %d)", h.mu.ctx.Txn().StartTS(), tableID, colInfo.ID, int64(len(value.GetBytes()))*count)) + _, err = exec.Execute(ctx, fmt.Sprintf("insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, tot_col_size) values (%d, %d, 0, %d, 1, %d)", h.mu.ctx.Txn().StartTS(), physicalID, colInfo.ID, int64(len(value.GetBytes()))*count)) if err != nil { return } @@ -133,7 +154,7 @@ func (h *Handle) insertColStats2KV(tableID int64, colInfo *model.ColumnInfo) (er return } // There must be only one bucket for this new column and the value is the default value. - _, err = exec.Execute(ctx, fmt.Sprintf("insert into mysql.stats_buckets (table_id, is_index, hist_id, bucket_id, repeats, count, lower_bound, upper_bound) values (%d, 0, %d, 0, %d, %d, X'%X', X'%X')", tableID, colInfo.ID, count, count, value.GetBytes(), value.GetBytes())) + _, err = exec.Execute(ctx, fmt.Sprintf("insert into mysql.stats_buckets (table_id, is_index, hist_id, bucket_id, repeats, count, lower_bound, upper_bound) values (%d, 0, %d, 0, %d, %d, X'%X', X'%X')", physicalID, colInfo.ID, count, count, value.GetBytes(), value.GetBytes())) if err != nil { return } diff --git a/statistics/ddl_test.go b/statistics/ddl_test.go index a226eb97ae9e9..1d2c9368c0384 100644 --- a/statistics/ddl_test.go +++ b/statistics/ddl_test.go @@ -15,7 +15,7 @@ package statistics_test import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/model" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testkit" @@ -137,7 +137,7 @@ func (s *testStatsCacheSuite) TestDDLHistogram(c *C) { c.Assert(count, Equals, float64(2)) count, err = statsTbl.ColumnEqualRowCount(sc, types.NewIntDatum(1), tableInfo.Columns[3].ID) c.Assert(err, IsNil) - c.Assert(count, Equals, float64(2)) + c.Assert(count, Equals, float64(0)) testKit.MustExec("alter table t add column c4 datetime NOT NULL default CURRENT_TIMESTAMP") err = h.HandleDDLEvent(<-h.DDLEventCh()) @@ -171,3 +171,50 @@ func (s *testStatsCacheSuite) TestDDLHistogram(c *C) { rs = testKit.MustQuery("select count(*) from mysql.stats_buckets where table_id = ? and hist_id = 1 and is_index = 1", tableInfo.ID) rs.Check(testkit.Rows("2")) } + +func (s *testStatsCacheSuite) TestDDLPartition(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("set @@session.tidb_enable_table_partition=1") + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) +PARTITION BY RANGE ( a ) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11), + PARTITION p2 VALUES LESS THAN (16), + PARTITION p3 VALUES LESS THAN (21) +)` + testKit.MustExec(createTable) + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + h := do.StatsHandle() + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + h.Update(is) + pi := tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.Pseudo, IsFalse) + } + + testKit.MustExec("insert into t values (1,2),(6,2),(11,2),(16,2)") + testKit.MustExec("analyze table t") + testKit.MustExec("alter table t add column c varchar(15) DEFAULT '123'") + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + is = do.InfoSchema() + h.Update(is) + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo = tbl.Meta() + pi = tableInfo.GetPartitionInfo() + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.Pseudo, IsFalse) + c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].AvgColSize(statsTbl.Count), Equals, 3.0) + } +} diff --git a/statistics/dump.go b/statistics/dump.go index 70a04e87b21c8..49a08f127e838 100644 --- a/statistics/dump.go +++ b/statistics/dump.go @@ -16,9 +16,9 @@ package statistics import ( "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tipb/go-tipb" diff --git a/statistics/dump_test.go b/statistics/dump_test.go index 5564c688bdd82..c3824d38b88f3 100644 --- a/statistics/dump_test.go +++ b/statistics/dump_test.go @@ -17,9 +17,9 @@ import ( "fmt" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" diff --git a/statistics/feedback.go b/statistics/feedback.go index 6477aa57e42ad..405c084943e63 100644 --- a/statistics/feedback.go +++ b/statistics/feedback.go @@ -23,9 +23,9 @@ import ( "time" "github.com/cznic/mathutil" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -48,18 +48,18 @@ type feedback struct { // QueryFeedback is used to represent the query feedback info. It contains the query's scan ranges and number of rows // in each range. type QueryFeedback struct { - tableID int64 - hist *Histogram - tp int - feedback []feedback - expected int64 // expected is the expected scan count of corresponding query. - actual int64 // actual is the actual scan count of corresponding query. - valid bool // valid represents the whether this query feedback is still valid. - desc bool // desc represents the corresponding query is desc scan. + physicalID int64 + hist *Histogram + tp int + feedback []feedback + expected int64 // expected is the expected scan count of corresponding query. + actual int64 // actual is the actual scan count of corresponding query. + valid bool // valid represents the whether this query feedback is still valid. + desc bool // desc represents the corresponding query is desc scan. } // NewQueryFeedback returns a new query feedback. -func NewQueryFeedback(tableID int64, hist *Histogram, expected int64, desc bool) *QueryFeedback { +func NewQueryFeedback(physicalID int64, hist *Histogram, expected int64, desc bool) *QueryFeedback { if hist != nil && hist.Len() == 0 { hist = nil } @@ -68,12 +68,12 @@ func NewQueryFeedback(tableID int64, hist *Histogram, expected int64, desc bool) tp = indexType } return &QueryFeedback{ - tableID: tableID, - valid: true, - tp: tp, - hist: hist, - expected: expected, - desc: desc, + physicalID: physicalID, + valid: true, + tp: tp, + hist: hist, + expected: expected, + desc: desc, } } @@ -243,12 +243,71 @@ type BucketFeedback struct { upper *types.Datum // The upper bound of the new bucket. } +// outOfRange checks if the `val` is between `min` and `max`. +func outOfRange(sc *stmtctx.StatementContext, min, max, val *types.Datum) (int, error) { + result, err := val.CompareDatum(sc, min) + if err != nil { + return 0, err + } + if result < 0 { + return result, nil + } + result, err = val.CompareDatum(sc, max) + if err != nil { + return 0, err + } + if result > 0 { + return result, nil + } + return 0, nil +} + +// adjustFeedbackBoundaries adjust the feedback boundaries according to the `min` and `max`. +// If the feedback has no intersection with `min` and `max`, we could just skip this feedback. +func (f *feedback) adjustFeedbackBoundaries(sc *stmtctx.StatementContext, min, max *types.Datum) (bool, error) { + result, err := outOfRange(sc, min, max, f.lower) + if err != nil { + return false, err + } + if result > 0 { + return true, nil + } + if result < 0 { + f.lower = min + } + result, err = outOfRange(sc, min, max, f.upper) + if err != nil { + return false, err + } + if result < 0 { + return true, nil + } + if result > 0 { + f.upper = max + } + return false, nil +} + // buildBucketFeedback build the feedback for each bucket from the histogram feedback. func buildBucketFeedback(h *Histogram, feedback *QueryFeedback) (map[int]*BucketFeedback, int) { bktID2FB := make(map[int]*BucketFeedback) + if len(feedback.feedback) == 0 { + return bktID2FB, 0 + } total := 0 - for _, ran := range feedback.feedback { - idx, _ := h.Bounds.LowerBound(0, ran.lower) + sc := &stmtctx.StatementContext{TimeZone: time.UTC} + kind := feedback.feedback[0].lower.Kind() + min, max := getMinValue(kind, h.tp), getMaxValue(kind, h.tp) + for _, fb := range feedback.feedback { + skip, err := fb.adjustFeedbackBoundaries(sc, &min, &max) + if err != nil { + log.Debugf("adjust feedback boundaries failed, err: %v", errors.ErrorStack(err)) + continue + } + if skip { + continue + } + idx, _ := h.Bounds.LowerBound(0, fb.lower) bktIdx := 0 // The last bucket also stores the feedback that falls outside the upper bound. if idx >= h.Bounds.NumRows()-2 { @@ -256,7 +315,7 @@ func buildBucketFeedback(h *Histogram, feedback *QueryFeedback) (map[int]*Bucket } else { bktIdx = idx / 2 // Make sure that this feedback lies within the bucket. - if chunk.Compare(h.Bounds.GetRow(2*bktIdx+1), 0, ran.upper) < 0 { + if chunk.Compare(h.Bounds.GetRow(2*bktIdx+1), 0, fb.upper) < 0 { continue } } @@ -266,23 +325,23 @@ func buildBucketFeedback(h *Histogram, feedback *QueryFeedback) (map[int]*Bucket bkt = &BucketFeedback{lower: h.GetLower(bktIdx), upper: h.GetUpper(bktIdx)} bktID2FB[bktIdx] = bkt } - bkt.feedback = append(bkt.feedback, ran) + bkt.feedback = append(bkt.feedback, fb) // Update the bound if necessary. - res, err := bkt.lower.CompareDatum(nil, ran.lower) + res, err := bkt.lower.CompareDatum(nil, fb.lower) if err != nil { - log.Debugf("compare datum %v with %v failed, err: %v", bkt.lower, ran.lower, errors.ErrorStack(err)) + log.Debugf("compare datum %v with %v failed, err: %v", bkt.lower, fb.lower, errors.ErrorStack(err)) continue } if res > 0 { - bkt.lower = ran.lower + bkt.lower = fb.lower } - res, err = bkt.upper.CompareDatum(nil, ran.upper) + res, err = bkt.upper.CompareDatum(nil, fb.upper) if err != nil { - log.Debugf("compare datum %v with %v failed, err: %v", bkt.upper, ran.upper, errors.ErrorStack(err)) + log.Debugf("compare datum %v with %v failed, err: %v", bkt.upper, fb.upper, errors.ErrorStack(err)) continue } if res < 0 { - bkt.upper = ran.upper + bkt.upper = fb.upper } } return bktID2FB, total @@ -528,7 +587,12 @@ func splitBuckets(h *Histogram, feedback *QueryFeedback) ([]bucket, []bool, int6 func UpdateHistogram(h *Histogram, feedback *QueryFeedback) *Histogram { buckets, isNewBuckets, totalCount := splitBuckets(h, feedback) buckets = mergeBuckets(buckets, isNewBuckets, float64(totalCount)) - return buildNewHistogram(h, buckets) + hist := buildNewHistogram(h, buckets) + // Update the NDV of primary key column. + if feedback.tp == pkType { + hist.NDV = int64(hist.totalRowCount()) + } + return hist } // UpdateCMSketch updates the CMSketch by feedback. @@ -738,7 +802,7 @@ func (q *QueryFeedback) Equal(rq *QueryFeedback) bool { // recalculateExpectCount recalculates the expect row count if the origin row count is estimated by pseudo. func (q *QueryFeedback) recalculateExpectCount(h *Handle) error { - t, ok := h.statsCache.Load().(statsCache)[q.tableID] + t, ok := h.statsCache.Load().(statsCache)[q.physicalID] if !ok { return nil } @@ -893,7 +957,7 @@ func logForIndex(prefix string, t *Table, idx *Index, ranges []*ranger.Range, ac } func (q *QueryFeedback) logDetailedInfo(h *Handle) { - t, ok := h.statsCache.Load().(statsCache)[q.tableID] + t, ok := h.statsCache.Load().(statsCache)[q.physicalID] if !ok { return } @@ -969,7 +1033,7 @@ func dumpFeedbackForIndex(h *Handle, q *QueryFeedback, t *Table) error { } colName := idx.Info.Columns[rangePosition].Name.L var rangeCount float64 - rangeFB := &QueryFeedback{tableID: q.tableID} + rangeFB := &QueryFeedback{physicalID: q.physicalID} // prefer index stats over column stats if idx := t.indexStartWithColumn(colName); idx != nil && idx.Histogram.Len() != 0 { rangeCount, err = t.GetRowCountByIndexRanges(sc, idx.ID, []*ranger.Range{&rang}) @@ -1077,13 +1141,13 @@ func supportColumnType(k byte) bool { func getMaxValue(k byte, ft *types.FieldType) (max types.Datum) { switch k { case types.KindInt64: - max.SetInt64(math.MaxInt64) + max.SetInt64(types.SignedUpperBound[ft.Tp]) case types.KindUint64: - max.SetUint64(math.MaxUint64) + max.SetUint64(types.UnsignedUpperBound[ft.Tp]) case types.KindFloat32: - max.SetFloat32(math.MaxFloat32) + max.SetFloat32(float32(types.GetMaxFloat(ft.Flen, ft.Decimal))) case types.KindFloat64: - max.SetFloat64(math.MaxFloat64) + max.SetFloat64(types.GetMaxFloat(ft.Flen, ft.Decimal)) case types.KindString, types.KindBytes: val := types.MaxValueDatum() bytes, err := codec.EncodeKey(nil, nil, val) @@ -1093,7 +1157,7 @@ func getMaxValue(k byte, ft *types.FieldType) (max types.Datum) { } max.SetBytes(bytes) case types.KindMysqlDecimal: - max.SetMysqlDecimal(types.NewMaxOrMinDec(false, mysql.MaxDecimalWidth, 0)) + max.SetMysqlDecimal(types.NewMaxOrMinDec(false, ft.Flen, ft.Decimal)) case types.KindMysqlDuration: max.SetMysqlDuration(types.Duration{Duration: math.MaxInt64}) case types.KindMysqlTime: @@ -1109,13 +1173,13 @@ func getMaxValue(k byte, ft *types.FieldType) (max types.Datum) { func getMinValue(k byte, ft *types.FieldType) (min types.Datum) { switch k { case types.KindInt64: - min.SetInt64(math.MinInt64) + min.SetInt64(types.SignedLowerBound[ft.Tp]) case types.KindUint64: min.SetUint64(0) case types.KindFloat32: - min.SetFloat32(-math.MaxFloat32) + min.SetFloat32(float32(-types.GetMaxFloat(ft.Flen, ft.Decimal))) case types.KindFloat64: - min.SetFloat64(-math.MaxFloat64) + min.SetFloat64(-types.GetMaxFloat(ft.Flen, ft.Decimal)) case types.KindString, types.KindBytes: val := types.MinNotNullDatum() bytes, err := codec.EncodeKey(nil, nil, val) @@ -1125,7 +1189,7 @@ func getMinValue(k byte, ft *types.FieldType) (min types.Datum) { } min.SetBytes(bytes) case types.KindMysqlDecimal: - min.SetMysqlDecimal(types.NewMaxOrMinDec(true, mysql.MaxDecimalWidth, 0)) + min.SetMysqlDecimal(types.NewMaxOrMinDec(true, ft.Flen, ft.Decimal)) case types.KindMysqlDuration: min.SetMysqlDuration(types.Duration{Duration: math.MinInt64}) case types.KindMysqlTime: diff --git a/statistics/feedback_test.go b/statistics/feedback_test.go index 9b0907a2b6a0e..08058c386bef2 100644 --- a/statistics/feedback_test.go +++ b/statistics/feedback_test.go @@ -15,7 +15,7 @@ package statistics import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" ) @@ -70,7 +70,7 @@ func (s *testFeedbackSuite) TestUpdateHistogram(c *C) { defaultBucketCount = 7 defer func() { defaultBucketCount = originBucketCount }() c.Assert(UpdateHistogram(q.Hist(), q).ToString(0), Equals, - "column:0 ndv:0 totColSize:0\n"+ + "column:0 ndv:10057 totColSize:0\n"+ "num: 10000 lower_bound: 0 upper_bound: 1 repeats: 0\n"+ "num: 8 lower_bound: 2 upper_bound: 7 repeats: 0\n"+ "num: 11 lower_bound: 8 upper_bound: 19 repeats: 0\n"+ diff --git a/statistics/gc.go b/statistics/gc.go index 75efc03c1558a..8aaeba70d2115 100644 --- a/statistics/gc.go +++ b/statistics/gc.go @@ -48,8 +48,8 @@ func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error return nil } -func (h *Handle) gcTableStats(is infoschema.InfoSchema, tableID int64) error { - sql := fmt.Sprintf("select is_index, hist_id from mysql.stats_histograms where table_id = %d", tableID) +func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error { + sql := fmt.Sprintf("select is_index, hist_id from mysql.stats_histograms where table_id = %d", physicalID) rows, _, err := h.restrictedExec.ExecRestrictedSQL(nil, sql) if err != nil { return errors.Trace(err) @@ -57,13 +57,15 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, tableID int64) error { // The table has already been deleted in stats and acknowledged to all tidb, // we can safely remove the meta info now. if len(rows) == 0 { - sql := fmt.Sprintf("delete from mysql.stats_meta where table_id = %d", tableID) + sql := fmt.Sprintf("delete from mysql.stats_meta where table_id = %d", physicalID) _, _, err := h.restrictedExec.ExecRestrictedSQL(nil, sql) return errors.Trace(err) } - tbl, ok := is.TableByID(tableID) + h.mu.Lock() + tbl, ok := h.getTableByPhysicalID(is, physicalID) + h.mu.Unlock() if !ok { - return errors.Trace(h.DeleteTableStatsFromKV(tableID)) + return errors.Trace(h.DeleteTableStatsFromKV(physicalID)) } tblInfo := tbl.Meta() for _, row := range rows { @@ -85,7 +87,7 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, tableID int64) error { } } if !find { - if err := h.deleteHistStatsFromKV(tblInfo.ID, histID, int(isIndex)); err != nil { + if err := h.deleteHistStatsFromKV(physicalID, histID, int(isIndex)); err != nil { return errors.Trace(err) } } @@ -94,7 +96,7 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, tableID int64) error { } // deleteHistStatsFromKV deletes all records about a column or an index and updates version. -func (h *Handle) deleteHistStatsFromKV(tableID int64, histID int64, isIndex int) (err error) { +func (h *Handle) deleteHistStatsFromKV(physicalID int64, histID int64, isIndex int) (err error) { h.mu.Lock() defer h.mu.Unlock() exec := h.mu.ctx.(sqlexec.SQLExecutor) @@ -106,22 +108,22 @@ func (h *Handle) deleteHistStatsFromKV(tableID int64, histID int64, isIndex int) err = finishTransaction(context.Background(), exec, err) }() // First of all, we update the version. If this table doesn't exist, it won't have any problem. Because we cannot delete anything. - _, err = exec.Execute(context.Background(), fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", h.mu.ctx.Txn().StartTS(), tableID)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", h.mu.ctx.Txn().StartTS(), physicalID)) if err != nil { return } // delete histogram meta - _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_histograms where table_id = %d and hist_id = %d and is_index = %d", tableID, histID, isIndex)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_histograms where table_id = %d and hist_id = %d and is_index = %d", physicalID, histID, isIndex)) if err != nil { return } // delete all buckets - _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d and hist_id = %d and is_index = %d", tableID, histID, isIndex)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d and hist_id = %d and is_index = %d", physicalID, histID, isIndex)) return } // DeleteTableStatsFromKV deletes table statistics from kv. -func (h *Handle) DeleteTableStatsFromKV(id int64) (err error) { +func (h *Handle) DeleteTableStatsFromKV(physicalID int64) (err error) { h.mu.Lock() defer h.mu.Unlock() exec := h.mu.ctx.(sqlexec.SQLExecutor) @@ -133,15 +135,15 @@ func (h *Handle) DeleteTableStatsFromKV(id int64) (err error) { err = finishTransaction(context.Background(), exec, err) }() // We only update the version so that other tidb will know that this table is deleted. - sql := fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", h.mu.ctx.Txn().StartTS(), id) + sql := fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", h.mu.ctx.Txn().StartTS(), physicalID) _, err = exec.Execute(context.Background(), sql) if err != nil { return } - _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_histograms where table_id = %d", id)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_histograms where table_id = %d", physicalID)) if err != nil { return } - _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d", id)) + _, err = exec.Execute(context.Background(), fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d", physicalID)) return } diff --git a/statistics/gc_test.go b/statistics/gc_test.go index 71116bf8d4fe2..054e4ff5526ff 100644 --- a/statistics/gc_test.go +++ b/statistics/gc_test.go @@ -52,3 +52,39 @@ func (s *testStatsUpdateSuite) TestGCStats(c *C) { c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) } + +func (s *testStatsUpdateSuite) TestGCPartition(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("set @@session.tidb_enable_table_partition=1") + testKit.MustExec(`create table t (a bigint(64), b bigint(64), index idx(a, b)) + partition by range (a) ( + partition p0 values less than (3), + partition p1 values less than (6))`) + testKit.MustExec("insert into t values (1,2),(2,3),(3,4),(4,5),(5,6)") + testKit.MustExec("analyze table t") + + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("6")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("15")) + h := s.do.StatsHandle() + h.SetLastUpdateVersion(math.MaxUint64) + ddlLease := time.Duration(0) + testKit.MustExec("alter table t drop index idx") + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("4")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("10")) + + testKit.MustExec("alter table t drop column b") + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("2")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("5")) + + testKit.MustExec("drop table t") + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("2")) + testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("0")) + testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("0")) + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) +} diff --git a/statistics/handle.go b/statistics/handle.go index b014d863c97e5..7033df47deed1 100644 --- a/statistics/handle.go +++ b/statistics/handle.go @@ -19,9 +19,9 @@ import ( "sync/atomic" "time" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" diff --git a/statistics/handle_test.go b/statistics/handle_test.go index 6cfdca998e0d1..778e7cf06d7d6 100644 --- a/statistics/handle_test.go +++ b/statistics/handle_test.go @@ -18,9 +18,9 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" diff --git a/statistics/histogram.go b/statistics/histogram.go index f56072ffb29f1..75905ecdfab41 100644 --- a/statistics/histogram.go +++ b/statistics/histogram.go @@ -20,12 +20,12 @@ import ( "strings" "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" @@ -679,7 +679,7 @@ func (hg *Histogram) AvgCountPerValue(totalCount int64) float64 { } func (hg *Histogram) outOfRange(val types.Datum) bool { - if hg.Bounds == nil { + if hg.Len() == 0 { return true } return chunk.Compare(hg.Bounds.GetRow(0), 0, &val) > 0 || @@ -729,7 +729,7 @@ func (c *Column) String() string { return c.Histogram.ToString(0) } -func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum) (float64, error) { +func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum, modifyCount int64) (float64, error) { if val.IsNull() { return float64(c.NullCount), nil } @@ -738,7 +738,7 @@ func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum) (f return 0.0, nil } if c.NDV > 0 && c.outOfRange(val) { - return c.totalRowCount() / (float64(c.NDV)), nil + return float64(modifyCount) / float64(c.NDV), nil } if c.CMSketch != nil { count, err := c.CMSketch.queryValue(sc, val) @@ -759,7 +759,7 @@ func (c *Column) getColumnRowCount(sc *stmtctx.StatementContext, ranges []*range // the point case. if !rg.LowExclude && !rg.HighExclude { var cnt float64 - cnt, err = c.equalRowCount(sc, rg.LowVal[0]) + cnt, err = c.equalRowCount(sc, rg.LowVal[0], modifyCount) if err != nil { return 0, errors.Trace(err) } @@ -773,14 +773,14 @@ func (c *Column) getColumnRowCount(sc *stmtctx.StatementContext, ranges []*range cnt += float64(modifyCount) / outOfRangeBetweenRate } if rg.LowExclude { - lowCnt, err := c.equalRowCount(sc, rg.LowVal[0]) + lowCnt, err := c.equalRowCount(sc, rg.LowVal[0], modifyCount) if err != nil { return 0, errors.Trace(err) } cnt -= lowCnt } if !rg.HighExclude { - highCnt, err := c.equalRowCount(sc, rg.HighVal[0]) + highCnt, err := c.equalRowCount(sc, rg.HighVal[0], modifyCount) if err != nil { return 0, errors.Trace(err) } @@ -809,10 +809,10 @@ func (idx *Index) String() string { return idx.Histogram.ToString(len(idx.Info.Columns)) } -func (idx *Index) equalRowCount(sc *stmtctx.StatementContext, b []byte) float64 { +func (idx *Index) equalRowCount(sc *stmtctx.StatementContext, b []byte, modifyCount int64) float64 { val := types.NewBytesDatum(b) if idx.NDV > 0 && idx.outOfRange(val) { - return idx.totalRowCount() / (float64(idx.NDV)) + return float64(modifyCount) / (float64(idx.NDV)) } if idx.CMSketch != nil { return float64(idx.CMSketch.QueryBytes(b)) @@ -834,7 +834,7 @@ func (idx *Index) getRowCount(sc *stmtctx.StatementContext, indexRanges []*range fullLen := len(indexRange.LowVal) == len(indexRange.HighVal) && len(indexRange.LowVal) == len(idx.Info.Columns) if fullLen && bytes.Equal(lb, rb) { if !indexRange.LowExclude && !indexRange.HighExclude { - totalCount += idx.equalRowCount(sc, lb) + totalCount += idx.equalRowCount(sc, lb, modifyCount) } continue } @@ -858,7 +858,7 @@ func (idx *Index) getRowCount(sc *stmtctx.StatementContext, indexRanges []*range } func (idx *Index) outOfRange(val types.Datum) bool { - if idx.Bounds == nil { + if idx.Histogram.Len() == 0 { return true } withInLowBoundOrPrefixMatch := chunk.Compare(idx.Bounds.GetRow(0), 0, &val) <= 0 || diff --git a/statistics/sample.go b/statistics/sample.go index 6b841fab0bd30..70eed697a812a 100644 --- a/statistics/sample.go +++ b/statistics/sample.go @@ -17,11 +17,13 @@ import ( "fmt" "math/rand" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tipb/go-tipb" "github.com/pkg/errors" "golang.org/x/net/context" @@ -73,6 +75,8 @@ func SampleCollectorToProto(c *SampleCollector) *tipb.SampleCollector { return collector } +const maxSampleValueLength = mysql.MaxFieldVarCharLength / 2 + // SampleCollectorFromProto converts SampleCollector from its protobuf representation. func SampleCollectorFromProto(collector *tipb.SampleCollector) *SampleCollector { s := &SampleCollector{ @@ -85,7 +89,10 @@ func SampleCollectorFromProto(collector *tipb.SampleCollector) *SampleCollector } s.CMSketch = CMSketchFromProto(collector.CmSketch) for _, val := range collector.Samples { - s.Samples = append(s.Samples, types.NewBytesDatum(val)) + // When store the histogram bucket boundaries to kv, we need to limit the length of the value. + if len(val) <= maxSampleValueLength { + s.Samples = append(s.Samples, types.NewBytesDatum(val)) + } } return s } @@ -126,7 +133,7 @@ func (c *SampleCollector) collect(sc *stmtctx.StatementContext, d types.Datum) e // Also, if primary key is handle, it will directly build histogram for it. type SampleBuilder struct { Sc *stmtctx.StatementContext - RecordSet ast.RecordSet + RecordSet sqlexec.RecordSet ColLen int // ColLen is the number of columns need to be sampled. PkBuilder *SortedBuilder MaxBucketSize int64 @@ -169,7 +176,7 @@ func (s SampleBuilder) CollectColumnStats() ([]*SampleCollector, *SortedBuilder, panic(fmt.Sprintf("%T", s.RecordSet)) } for row := it.Begin(); row != it.End(); row = it.Next() { - datums := ast.RowToDatums(row, s.RecordSet.Fields()) + datums := RowToDatums(row, s.RecordSet.Fields()) if s.PkBuilder != nil { err = s.PkBuilder.Iterate(datums[0]) if err != nil { @@ -186,3 +193,12 @@ func (s SampleBuilder) CollectColumnStats() ([]*SampleCollector, *SortedBuilder, } } } + +// RowToDatums converts row to datum slice. +func RowToDatums(row chunk.Row, fields []*ast.ResultField) []types.Datum { + datums := make([]types.Datum, len(fields)) + for i, f := range fields { + datums[i] = row.GetDatum(i, &f.Column.FieldType) + } + return datums +} diff --git a/statistics/sample_test.go b/statistics/sample_test.go index dc3cc3e222303..dfc7b59df597b 100644 --- a/statistics/sample_test.go +++ b/statistics/sample_test.go @@ -17,18 +17,18 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/sqlexec" ) var _ = Suite(&testSampleSuite{}) type testSampleSuite struct { count int - rs ast.RecordSet + rs sqlexec.RecordSet } func (s *testSampleSuite) SetUpSuite(c *C) { diff --git a/statistics/scalar.go b/statistics/scalar.go index 1ea756a6e6d0c..446a78a7383f6 100644 --- a/statistics/scalar.go +++ b/statistics/scalar.go @@ -17,7 +17,7 @@ import ( "encoding/binary" "math" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" ) diff --git a/statistics/scalar_test.go b/statistics/scalar_test.go index 80a1d860fa435..027294a075b62 100644 --- a/statistics/scalar_test.go +++ b/statistics/scalar_test.go @@ -17,7 +17,7 @@ import ( "math" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" ) diff --git a/statistics/selectivity.go b/statistics/selectivity.go index ef474455d98ea..58d4a6a9ffc62 100644 --- a/statistics/selectivity.go +++ b/statistics/selectivity.go @@ -16,9 +16,9 @@ package statistics import ( "math" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/ranger" "github.com/pkg/errors" diff --git a/statistics/selectivity_test.go b/statistics/selectivity_test.go index ed24d0b97f326..4895ea33b6117 100644 --- a/statistics/selectivity_test.go +++ b/statistics/selectivity_test.go @@ -22,10 +22,10 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" @@ -158,7 +158,7 @@ func (s *testSelectivitySuite) TestSelectivity(c *C) { }, { exprs: "a >= 1 and b > 1 and a < 2", - selectivity: 0.01817558299, + selectivity: 0.01783264746, }, { exprs: "a >= 1 and c > 1 and a < 2", @@ -174,7 +174,7 @@ func (s *testSelectivitySuite) TestSelectivity(c *C) { }, { exprs: "b > 1", - selectivity: 0.98148148148, + selectivity: 0.96296296296, }, { exprs: "a > 1 and b < 2 and c > 3 and d < 4 and e > 5", @@ -292,6 +292,36 @@ func (s *testSelectivitySuite) TestEstimationForUnknownValues(c *C) { count, err = statsTbl.GetRowCountByIndexRanges(sc, idxID, getRange(9, 30)) c.Assert(err, IsNil) c.Assert(count, Equals, 2.2) + + testKit.MustExec("truncate table t") + testKit.MustExec("insert into t values (null, null)") + testKit.MustExec("analyze table t") + table, err = s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + statsTbl = h.GetTableStats(table.Meta()) + + colID = table.Meta().Columns[0].ID + count, err = statsTbl.GetRowCountByColumnRanges(sc, colID, getRange(1, 30)) + c.Assert(err, IsNil) + c.Assert(count, Equals, 0.0) + + testKit.MustExec("drop table t") + testKit.MustExec("create table t(a int, b int, index idx(b))") + testKit.MustExec("insert into t values (1,1)") + testKit.MustExec("analyze table t") + table, err = s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + statsTbl = h.GetTableStats(table.Meta()) + + colID = table.Meta().Columns[0].ID + count, err = statsTbl.GetRowCountByColumnRanges(sc, colID, getRange(2, 2)) + c.Assert(err, IsNil) + c.Assert(count, Equals, 0.0) + + idxID = table.Meta().Indices[0].ID + count, err = statsTbl.GetRowCountByIndexRanges(sc, idxID, getRange(2, 2)) + c.Assert(err, IsNil) + c.Assert(count, Equals, 0.0) } func BenchmarkSelectivity(b *testing.B) { diff --git a/statistics/statistics_test.go b/statistics/statistics_test.go index d719edad22df9..fb79e934c18be 100644 --- a/statistics/statistics_test.go +++ b/statistics/statistics_test.go @@ -19,9 +19,9 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/ranger" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -43,8 +44,8 @@ var _ = Suite(&testStatisticsSuite{}) type testStatisticsSuite struct { count int samples []types.Datum - rc ast.RecordSet - pk ast.RecordSet + rc sqlexec.RecordSet + pk sqlexec.RecordSet } type recordSet struct { @@ -169,7 +170,7 @@ func encodeKey(key types.Datum) types.Datum { return types.NewBytesDatum(buf) } -func buildPK(sctx sessionctx.Context, numBuckets, id int64, records ast.RecordSet) (int64, *Histogram, error) { +func buildPK(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.RecordSet) (int64, *Histogram, error) { b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeLonglong)) ctx := context.Background() for { @@ -183,7 +184,7 @@ func buildPK(sctx sessionctx.Context, numBuckets, id int64, records ast.RecordSe } it := chunk.NewIterator4Chunk(chk) for row := it.Begin(); row != it.End(); row = it.Next() { - datums := ast.RowToDatums(row, records.Fields()) + datums := RowToDatums(row, records.Fields()) err = b.Iterate(datums[0]) if err != nil { return 0, nil, errors.Trace(err) @@ -193,7 +194,7 @@ func buildPK(sctx sessionctx.Context, numBuckets, id int64, records ast.RecordSe return b.Count, b.hist, nil } -func buildIndex(sctx sessionctx.Context, numBuckets, id int64, records ast.RecordSet) (int64, *Histogram, *CMSketch, error) { +func buildIndex(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.RecordSet) (int64, *Histogram, *CMSketch, error) { b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeBlob)) cms := NewCMSketch(8, 2048) ctx := context.Background() @@ -208,7 +209,7 @@ func buildIndex(sctx sessionctx.Context, numBuckets, id int64, records ast.Recor break } for row := it.Begin(); row != it.End(); row = it.Next() { - datums := ast.RowToDatums(row, records.Fields()) + datums := RowToDatums(row, records.Fields()) buf, err := codec.EncodeKey(sctx.GetSessionVars().StmtCtx, nil, datums...) if err != nil { return 0, nil, nil, errors.Trace(err) @@ -282,7 +283,7 @@ func (s *testStatisticsSuite) TestBuild(c *C) { checkRepeats(c, col) c.Assert(col.Len(), Equals, 250) - tblCount, col, _, err := buildIndex(ctx, bucketCount, 1, ast.RecordSet(s.rc)) + tblCount, col, _, err := buildIndex(ctx, bucketCount, 1, sqlexec.RecordSet(s.rc)) c.Check(err, IsNil) checkRepeats(c, col) col.PreCalculateScalar() @@ -299,7 +300,7 @@ func (s *testStatisticsSuite) TestBuild(c *C) { c.Check(int(count), Equals, 0) s.pk.(*recordSet).cursor = 0 - tblCount, col, err = buildPK(ctx, bucketCount, 4, ast.RecordSet(s.pk)) + tblCount, col, err = buildPK(ctx, bucketCount, 4, sqlexec.RecordSet(s.pk)) c.Check(err, IsNil) checkRepeats(c, col) col.PreCalculateScalar() @@ -338,7 +339,7 @@ func (s *testStatisticsSuite) TestBuild(c *C) { func (s *testStatisticsSuite) TestHistogramProtoConversion(c *C) { ctx := mock.NewContext() s.rc.Close() - tblCount, col, _, err := buildIndex(ctx, 256, 1, ast.RecordSet(s.rc)) + tblCount, col, _, err := buildIndex(ctx, 256, 1, sqlexec.RecordSet(s.rc)) c.Check(err, IsNil) c.Check(int(tblCount), Equals, 100000) diff --git a/statistics/table.go b/statistics/table.go index 3592b95fea1ef..f2995f3c181e0 100644 --- a/statistics/table.go +++ b/statistics/table.go @@ -19,9 +19,9 @@ import ( "strings" "sync" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -394,7 +394,7 @@ func (t *Table) ColumnEqualRowCount(sc *stmtctx.StatementContext, value types.Da return float64(t.Count) / pseudoEqualRate, nil } c := t.Columns[colID] - result, err := c.equalRowCount(sc, value) + result, err := c.equalRowCount(sc, value, t.ModifyCount) result *= c.getIncreaseFactor(t.Count) return result, errors.Trace(err) } @@ -551,7 +551,7 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 // so we use heuristic methods to estimate the selectivity. if idx.NDV > 0 && len(ran.LowVal) == len(idx.Info.Columns) && rangePosition == len(ran.LowVal) { // for equality queries - selectivity = 1.0 / float64(idx.NDV) + selectivity = float64(coll.ModifyCount) / float64(idx.NDV) / idx.totalRowCount() } else { // for range queries selectivity = float64(coll.ModifyCount) / outOfRangeBetweenRate / idx.totalRowCount() diff --git a/statistics/update.go b/statistics/update.go index 8c80baec91585..a66588487fed2 100644 --- a/statistics/update.go +++ b/statistics/update.go @@ -21,9 +21,9 @@ import ( "sync" "time" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/util/chunk" @@ -199,7 +199,7 @@ func (s *SessionStatsCollector) StoreQueryFeedback(feedback interface{}, h *Hand s.Lock() defer s.Unlock() isIndex := q.tp == indexType - s.rateMap.update(q.tableID, q.hist.ID, rate, isIndex) + s.rateMap.update(q.physicalID, q.hist.ID, rate, isIndex) if len(s.feedback) < MaxQueryFeedbackCount { s.feedback = append(s.feedback, q) } @@ -367,7 +367,7 @@ func (h *Handle) DumpStatsFeedbackToKV() error { if fb.tp == pkType { err = h.dumpFeedbackToKV(fb) } else { - t, ok := h.statsCache.Load().(statsCache)[fb.tableID] + t, ok := h.statsCache.Load().(statsCache)[fb.physicalID] if ok { err = dumpFeedbackForIndex(h, fb, t) } @@ -392,7 +392,7 @@ func (h *Handle) dumpFeedbackToKV(fb *QueryFeedback) error { isIndex = 1 } sql := fmt.Sprintf("insert into mysql.stats_feedback (table_id, hist_id, is_index, feedback) values "+ - "(%d, %d, %d, X'%X')", fb.tableID, fb.hist.ID, isIndex, vals) + "(%d, %d, %d, X'%X')", fb.physicalID, fb.hist.ID, isIndex, vals) h.mu.Lock() _, err = h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) h.mu.Unlock() @@ -416,11 +416,13 @@ func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { } h.listHead.Unlock() for _, fb := range h.feedback { - table, ok := is.TableByID(fb.tableID) + h.mu.Lock() + table, ok := h.getTableByPhysicalID(is, fb.physicalID) + h.mu.Unlock() if !ok { continue } - tblStats := h.GetTableStats(table.Meta()) + tblStats := h.GetPartitionStats(table.Meta(), fb.physicalID) newTblStats := tblStats.copy() if fb.tp == indexType { idx, ok := tblStats.Indices[fb.hist.ID] @@ -455,11 +457,11 @@ func (h *Handle) UpdateErrorRate(is infoschema.InfoSchema) { h.mu.Lock() tbls := make([]*Table, 0, len(h.mu.rateMap)) for id, item := range h.mu.rateMap { - table, ok := is.TableByID(id) + table, ok := h.getTableByPhysicalID(is, id) if !ok { continue } - tbl := h.GetTableStats(table.Meta()).copy() + tbl := h.GetPartitionStats(table.Meta(), id).copy() if item.PkErrorRate != nil && tbl.Columns[item.PkID] != nil { col := *tbl.Columns[item.PkID] col.ErrorRate.merge(item.PkErrorRate) @@ -558,10 +560,6 @@ func (h *Handle) handleSingleHistogramUpdate(is infoschema.InfoSchema, rows []ch log.Debugf("decode feedback failed, err: %v", errors.ErrorStack(err)) } } - // Update the NDV of primary key column. - if table.Meta().PKIsHandle && q.tp == pkType { - hist.NDV = int64(hist.totalRowCount()) - } err = h.dumpStatsUpdateToKV(physicalTableID, isIndex, q, hist, cms) return errors.Trace(err) } diff --git a/statistics/update_test.go b/statistics/update_test.go index fd8af3c44966f..34a8cb19638b6 100644 --- a/statistics/update_test.go +++ b/statistics/update_test.go @@ -19,10 +19,10 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" @@ -305,6 +305,57 @@ func (s *testStatsUpdateSuite) TestTxnWithFailure(c *C) { c.Assert(stats1.Count, Equals, int64(rowCount1+1)) } +func (s *testStatsUpdateSuite) TestUpdatePartition(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("set @@session.tidb_enable_table_partition=1") + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b char(5)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6),PARTITION p1 VALUES LESS THAN (11))` + testKit.MustExec(createTable) + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + h := do.StatsHandle() + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + pi := tableInfo.GetPartitionInfo() + c.Assert(len(pi.Definitions), Equals, 2) + bColID := tableInfo.Columns[1].ID + + testKit.MustExec(`insert into t values (1, "a"), (7, "a")`) + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.ModifyCount, Equals, int64(1)) + c.Assert(statsTbl.Count, Equals, int64(1)) + c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(1)) + } + + testKit.MustExec(`update t set a = a + 1, b = "aa"`) + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.ModifyCount, Equals, int64(2)) + c.Assert(statsTbl.Count, Equals, int64(1)) + c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(2)) + } + + testKit.MustExec("delete from t") + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.ModifyCount, Equals, int64(3)) + c.Assert(statsTbl.Count, Equals, int64(0)) + c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(0)) + } +} + func (s *testStatsUpdateSuite) TestAutoUpdate(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) @@ -548,6 +599,60 @@ func (s *testStatsUpdateSuite) TestUpdateErrorRate(c *C) { c.Assert(tbl.Indices[bID].QueryTotal, Equals, int64(0)) } +func (s *testStatsUpdateSuite) TestUpdatePartitionErrorRate(c *C) { + defer cleanEnv(c, s.store, s.do) + h := s.do.StatsHandle() + is := s.do.InfoSchema() + h.Lease = 0 + h.Update(is) + + oriProbability := statistics.FeedbackProbability + defer func() { + statistics.FeedbackProbability = oriProbability + }() + statistics.FeedbackProbability = 1 + + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("set @@session.tidb_enable_table_partition=1") + testKit.MustExec("create table t (a bigint(64), primary key(a)) partition by range (a) (partition p0 values less than (30))") + h.HandleDDLEvent(<-h.DDLEventCh()) + + testKit.MustExec("insert into t values (1)") + + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + testKit.MustExec("analyze table t") + + testKit.MustExec("insert into t values (2)") + testKit.MustExec("insert into t values (5)") + testKit.MustExec("insert into t values (8)") + testKit.MustExec("insert into t values (12)") + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + is = s.do.InfoSchema() + h.Update(is) + + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblInfo := table.Meta() + pid := tblInfo.Partition.Definitions[0].ID + tbl := h.GetPartitionStats(tblInfo, pid) + aID := tblInfo.Columns[0].ID + + // The statistic table is outdated now. + c.Assert(tbl.Columns[aID].NotAccurate(), IsTrue) + + testKit.MustQuery("select * from t where a between 1 and 10") + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + c.Assert(h.DumpStatsFeedbackToKV(), IsNil) + c.Assert(h.HandleUpdateStats(is), IsNil) + h.UpdateErrorRate(is) + h.Update(is) + tbl = h.GetPartitionStats(tblInfo, pid) + + // The error rate of this column is not larger than MaxErrorRate now. + c.Assert(tbl.Columns[aID].NotAccurate(), IsFalse) +} + func appendBucket(h *statistics.Histogram, l, r int64) { lower, upper := types.NewIntDatum(l), types.NewIntDatum(r) h.AppendBucket(&lower, &upper, 0, 0) @@ -632,7 +737,7 @@ func (s *testStatsUpdateSuite) TestQueryFeedback(c *C) { { // test primary key feedback sql: "select * from t where t.a <= 5", - hist: "column:1 ndv:3 totColSize:0\n" + + hist: "column:1 ndv:4 totColSize:0\n" + "num: 1 lower_bound: -9223372036854775808 upper_bound: 1 repeats: 0\n" + "num: 1 lower_bound: 2 upper_bound: 2 repeats: 1\n" + "num: 2 lower_bound: 3 upper_bound: 5 repeats: 0", @@ -898,6 +1003,41 @@ func (s *testStatsUpdateSuite) TestUpdateStatsByLocalFeedback(c *C) { h.UpdateStatsByLocalFeedback(s.do.InfoSchema()) } +func (s *testStatsUpdateSuite) TestUpdatePartitionStatsByLocalFeedback(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("set @@session.tidb_enable_table_partition=1") + testKit.MustExec("create table t (a bigint(64), b bigint(64), primary key(a)) partition by range (a) (partition p0 values less than (6))") + testKit.MustExec("insert into t values (1,2),(2,2),(4,5)") + testKit.MustExec("analyze table t") + testKit.MustExec("insert into t values (3,5)") + h := s.do.StatsHandle() + + oriProbability := statistics.FeedbackProbability + defer func() { + statistics.FeedbackProbability = oriProbability + }() + statistics.FeedbackProbability = 1 + + is := s.do.InfoSchema() + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + + testKit.MustQuery("select * from t where a > 1") + + h.UpdateStatsByLocalFeedback(s.do.InfoSchema()) + + tblInfo := table.Meta() + pid := tblInfo.Partition.Definitions[0].ID + tbl := h.GetPartitionStats(tblInfo, pid) + + c.Assert(tbl.Columns[tblInfo.Columns[0].ID].ToString(0), Equals, "column:1 ndv:3 totColSize:0\n"+ + "num: 1 lower_bound: 1 upper_bound: 1 repeats: 1\n"+ + "num: 1 lower_bound: 2 upper_bound: 2 repeats: 1\n"+ + "num: 2 lower_bound: 3 upper_bound: 9223372036854775807 repeats: 0") +} + type logHook struct { results string } @@ -1156,3 +1296,72 @@ func (s *testStatsUpdateSuite) TestIndexQueryFeedback(c *C) { c.Assert(tbl.Indices[t.idxID].CMSketch.QueryBytes(val), Equals, t.eqCount) } } + +func (s *testStatsUpdateSuite) TestFeedbackRanges(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + h := s.do.StatsHandle() + oriProbability := statistics.FeedbackProbability + oriNumber := statistics.MaxNumberOfRanges + defer func() { + statistics.FeedbackProbability = oriProbability + statistics.MaxNumberOfRanges = oriNumber + }() + statistics.FeedbackProbability = 1 + + testKit.MustExec("use test") + testKit.MustExec("create table t (a tinyint, b tinyint, primary key(a), index idx(a, b))") + for i := 0; i < 20; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i, i)) + } + h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + testKit.MustExec("analyze table t with 3 buckets") + for i := 30; i < 40; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i, i)) + } + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + tests := []struct { + sql string + hist string + colID int64 + }{ + { + sql: "select * from t where a <= 50 or (a > 130 and a < 140)", + hist: "column:1 ndv:30 totColSize:0\n" + + "num: 8 lower_bound: -128 upper_bound: 7 repeats: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 15 repeats: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0", + colID: 1, + }, + { + sql: "select * from t where a >= 10", + hist: "column:1 ndv:30 totColSize:0\n" + + "num: 8 lower_bound: -128 upper_bound: 7 repeats: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 15 repeats: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 127 repeats: 0", + colID: 1, + }, + { + sql: "select * from t use index(idx) where a = 1 and (b <= 50 or (b > 130 and b < 140))", + hist: "column:2 ndv:20 totColSize:20\n" + + "num: 7 lower_bound: -128 upper_bound: 6 repeats: 0\n" + + "num: 7 lower_bound: 7 upper_bound: 13 repeats: 1\n" + + "num: 6 lower_bound: 14 upper_bound: 19 repeats: 1", + colID: 2, + }, + } + is := s.do.InfoSchema() + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + for i, t := range tests { + testKit.MustQuery(t.sql) + c.Assert(h.DumpStatsDeltaToKV(statistics.DumpAll), IsNil) + c.Assert(h.DumpStatsFeedbackToKV(), IsNil) + c.Assert(h.HandleUpdateStats(s.do.InfoSchema()), IsNil) + c.Assert(err, IsNil) + h.Update(is) + tblInfo := table.Meta() + tbl := h.GetTableStats(tblInfo) + c.Assert(tbl.Columns[t.colID].ToString(0), Equals, tests[i].hist) + } +} diff --git a/store/mockstore/mocktikv/analyze.go b/store/mockstore/mocktikv/analyze.go index bbda6c3020b00..2659a4cde994e 100644 --- a/store/mockstore/mocktikv/analyze.go +++ b/store/mockstore/mocktikv/analyze.go @@ -16,13 +16,13 @@ package mocktikv import ( "github.com/golang/protobuf/proto" "github.com/pingcap/kvproto/pkg/coprocessor" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tipb/go-tipb" @@ -188,7 +188,7 @@ func (h *rpcHandler) handleAnalyzeColumnsReq(req *coprocessor.Request, analyzeRe return &coprocessor.Response{Data: data}, nil } -// Fields implements the ast.RecordSet Fields interface. +// Fields implements the sqlexec.RecordSet Fields interface. func (e *analyzeColumnsExec) Fields() []*ast.ResultField { return e.fields } @@ -232,7 +232,7 @@ func (e *analyzeColumnsExec) NewChunk() *chunk.Chunk { return chunk.NewChunkWithCapacity(fields, 1) } -// Close implements the ast.RecordSet Close interface. +// Close implements the sqlexec.RecordSet Close interface. func (e *analyzeColumnsExec) Close() error { return nil } diff --git a/store/mockstore/mocktikv/cop_handler_dag.go b/store/mockstore/mocktikv/cop_handler_dag.go index 0d874793e121b..913f839c6d9e0 100644 --- a/store/mockstore/mocktikv/cop_handler_dag.go +++ b/store/mockstore/mocktikv/cop_handler_dag.go @@ -23,14 +23,14 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/tikvpb" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" mockpkg "github.com/pingcap/tidb/util/mock" diff --git a/store/mockstore/mocktikv/executor.go b/store/mockstore/mocktikv/executor.go index b3d78396fdf3e..29f478b8e277f 100644 --- a/store/mockstore/mocktikv/executor.go +++ b/store/mockstore/mocktikv/executor.go @@ -19,10 +19,10 @@ import ( "sort" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" diff --git a/store/mockstore/mocktikv/mvcc_leveldb.go b/store/mockstore/mocktikv/mvcc_leveldb.go index 34abd116a3449..53cdb92c5a5d9 100644 --- a/store/mockstore/mocktikv/mvcc_leveldb.go +++ b/store/mockstore/mocktikv/mvcc_leveldb.go @@ -24,7 +24,7 @@ import ( "github.com/pingcap/goleveldb/leveldb/storage" "github.com/pingcap/goleveldb/leveldb/util" "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/util/codec" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/store/mockstore/mocktikv/rpc.go b/store/mockstore/mocktikv/rpc.go index 93a24331d9d9d..34ff33c87c5ec 100644 --- a/store/mockstore/mocktikv/rpc.go +++ b/store/mockstore/mocktikv/rpc.go @@ -24,9 +24,9 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" "golang.org/x/net/context" ) diff --git a/store/tikv/2pc.go b/store/tikv/2pc.go index 347490b64ebf1..cc5220fd11850 100644 --- a/store/tikv/2pc.go +++ b/store/tikv/2pc.go @@ -21,12 +21,12 @@ import ( "time" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" binlog "github.com/pingcap/tipb/go-binlog" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/store/tikv/2pc_fail_test.go b/store/tikv/2pc_fail_test.go index e840c94bed02b..1f2368d8fa833 100644 --- a/store/tikv/2pc_fail_test.go +++ b/store/tikv/2pc_fail_test.go @@ -16,7 +16,7 @@ package tikv import ( gofail "github.com/etcd-io/gofail/runtime" . "github.com/pingcap/check" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" "golang.org/x/net/context" ) diff --git a/store/tikv/backoff.go b/store/tikv/backoff.go index 69e68adfb0251..c804107a5867c 100644 --- a/store/tikv/backoff.go +++ b/store/tikv/backoff.go @@ -20,10 +20,10 @@ import ( "strings" "time" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "golang.org/x/net/context" diff --git a/store/tikv/client.go b/store/tikv/client.go index b1e95abc3b1e6..1633a01cde8ee 100644 --- a/store/tikv/client.go +++ b/store/tikv/client.go @@ -26,10 +26,10 @@ import ( "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/tikvpb" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" "golang.org/x/net/context" diff --git a/store/tikv/coprocessor.go b/store/tikv/coprocessor.go index 8db253229aa69..02d89a82dd4df 100644 --- a/store/tikv/coprocessor.go +++ b/store/tikv/coprocessor.go @@ -730,7 +730,7 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, resp *copRespo } if otherErr := resp.pbResp.GetOtherError(); otherErr != "" { err := errors.Errorf("other error: %s", otherErr) - log.Warnf("coprocessor err: %v", err) + log.Warnf("txn_start_ts:%d region_id:%d store_addr:%s, coprocessor err: %v", worker.req.StartTs, task.region.id, task.storeAddr, err) return nil, errors.Trace(err) } // When the request is using streaming API, the `Range` is not nil. diff --git a/store/tikv/error.go b/store/tikv/error.go index 9c78022c5fcae..9329de2eaf221 100644 --- a/store/tikv/error.go +++ b/store/tikv/error.go @@ -14,8 +14,8 @@ package tikv import ( - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" ) diff --git a/store/tikv/gcworker/gc_worker.go b/store/tikv/gcworker/gc_worker.go index c960808d25ba9..22a8726e86d6a 100644 --- a/store/tikv/gcworker/gc_worker.go +++ b/store/tikv/gcworker/gc_worker.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/parser/terror" "github.com/pingcap/pd/client" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/kv" @@ -35,7 +36,6 @@ import ( "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/terror" tidbutil "github.com/pingcap/tidb/util" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/store/tikv/isolation_test.go b/store/tikv/isolation_test.go index eeb5aa80e185d..e95028269a135 100644 --- a/store/tikv/isolation_test.go +++ b/store/tikv/isolation_test.go @@ -22,8 +22,8 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" "golang.org/x/net/context" ) diff --git a/store/tikv/safepoint_test.go b/store/tikv/safepoint_test.go index 29b640a1d48fd..e2142ccf9f1a2 100644 --- a/store/tikv/safepoint_test.go +++ b/store/tikv/safepoint_test.go @@ -18,8 +18,8 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" "golang.org/x/net/context" ) diff --git a/store/tikv/sql_fail_test.go b/store/tikv/sql_fail_test.go index 4fb976c557198..30bbc95c25ff7 100644 --- a/store/tikv/sql_fail_test.go +++ b/store/tikv/sql_fail_test.go @@ -20,10 +20,10 @@ import ( gofail "github.com/etcd-io/gofail/runtime" . "github.com/pingcap/check" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/session" . "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" "golang.org/x/net/context" diff --git a/store/tikv/tikv_test.go b/store/tikv/tikv_test.go index 2f759076cb6ab..a19a7d941075f 100644 --- a/store/tikv/tikv_test.go +++ b/store/tikv/tikv_test.go @@ -21,7 +21,7 @@ import ( "strings" . "github.com/pingcap/check" - "github.com/pingcap/tidb/parser" + "github.com/pingcap/parser" ) // OneByOneSuite is a suite, When with-tikv flag is true, there is only one storage, so the test suite have to run one by one. diff --git a/store/tikv/txn.go b/store/tikv/txn.go index 96ff1311244f9..110135718667a 100644 --- a/store/tikv/txn.go +++ b/store/tikv/txn.go @@ -75,7 +75,7 @@ func (txn *tikvTxn) SetVars(vars *kv.Variables) { txn.snapshot.vars = vars } -// SetMemBufCap sets the transaction's MemBuffer capability, to reduce memory allocations. +// SetCap sets the transaction's MemBuffer capability, to reduce memory allocations. func (txn *tikvTxn) SetCap(cap int) { txn.us.SetCap(cap) } diff --git a/structure/structure.go b/structure/structure.go index 81853deeeafed..4f7eb0e50ec7d 100644 --- a/structure/structure.go +++ b/structure/structure.go @@ -14,8 +14,8 @@ package structure import ( + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" ) // structure error codes. diff --git a/table/column.go b/table/column.go index 8e6bb6925a13d..9902b83aa07da 100644 --- a/table/column.go +++ b/table/column.go @@ -21,15 +21,15 @@ import ( "strings" "unicode/utf8" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/hack" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -286,7 +286,7 @@ func CheckOnce(cols []*Column) error { // CheckNotNull checks if nil value set to a column with NotNull flag is set. func (c *Column) CheckNotNull(data types.Datum) error { - if mysql.HasNotNullFlag(c.Flag) && data.IsNull() { + if (mysql.HasNotNullFlag(c.Flag) && data.IsNull() || mysql.HasPreventNullInsertFlag(c.Flag)) && data.IsNull() { return ErrColumnCantNull.GenWithStackByArgs(c.Name) } return nil diff --git a/table/column_test.go b/table/column_test.go index 4bf3bc104c0c3..3d34a1436892f 100644 --- a/table/column_test.go +++ b/table/column_test.go @@ -17,11 +17,11 @@ import ( "testing" . "github.com/pingcap/check" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" ) diff --git a/table/index.go b/table/index.go index 8957025549dcd..1b7d247c6ed13 100644 --- a/table/index.go +++ b/table/index.go @@ -14,8 +14,8 @@ package table import ( + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" diff --git a/table/table.go b/table/table.go index ac99df34f397e..021bb6740ad4d 100644 --- a/table/table.go +++ b/table/table.go @@ -18,12 +18,12 @@ package table import ( + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" ) diff --git a/table/tables/gen_expr.go b/table/tables/gen_expr.go index fa94ca009c74d..f0f88e2924cc7 100644 --- a/table/tables/gen_expr.go +++ b/table/tables/gen_expr.go @@ -16,9 +16,9 @@ package tables import ( "fmt" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser" + "github.com/pingcap/parser" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pkg/errors" ) diff --git a/table/tables/gen_expr_test.go b/table/tables/gen_expr_test.go index 89de193f5cd42..9723e32e63841 100644 --- a/table/tables/gen_expr_test.go +++ b/table/tables/gen_expr_test.go @@ -15,7 +15,7 @@ package tables import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" ) var _ = Suite(&testGenExprSuite{}) diff --git a/table/tables/index.go b/table/tables/index.go index e11993001bfac..e4253d9275537 100644 --- a/table/tables/index.go +++ b/table/tables/index.go @@ -19,14 +19,14 @@ import ( "io" "unicode/utf8" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/codec" "github.com/pkg/errors" ) diff --git a/table/tables/index_test.go b/table/tables/index_test.go index 5e8350e8dd46c..1abe161696f6f 100644 --- a/table/tables/index_test.go +++ b/table/tables/index_test.go @@ -18,14 +18,14 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" diff --git a/table/tables/partition.go b/table/tables/partition.go index 762c4e7976e7f..efcaf596d7b62 100644 --- a/table/tables/partition.go +++ b/table/tables/partition.go @@ -19,9 +19,9 @@ import ( "sort" "strings" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" diff --git a/table/tables/tables.go b/table/tables/tables.go index 8660f8625e27e..f244991c5d9cd 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -24,10 +24,10 @@ import ( "strings" "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" @@ -338,6 +338,14 @@ func (t *tableCommon) UpdateRecord(ctx sessionctx.Context, h int64, oldData, new return errors.Trace(err) } } + colSize := make(map[int64]int64) + for id, col := range t.Cols() { + val := int64(len(newData[id].GetBytes()) - len(oldData[id].GetBytes())) + if val != 0 { + colSize[col.ID] = val + } + } + ctx.GetSessionVars().TxnCtx.UpdateDeltaForTable(t.physicalTableID, 0, 1, colSize) return nil } @@ -500,7 +508,7 @@ func (t *tableCommon) AddRecord(ctx sessionctx.Context, r []types.Datum, skipHan colSize[col.ID] = val } } - sessVars.TxnCtx.UpdateDeltaForTable(t.tableID, 1, 1, colSize) + sessVars.TxnCtx.UpdateDeltaForTable(t.physicalTableID, 1, 1, colSize) return recordID, nil } @@ -661,6 +669,14 @@ func (t *tableCommon) RemoveRecord(ctx sessionctx.Context, h int64, r []types.Da } err = t.addDeleteBinlog(ctx, binlogRow, colIDs) } + colSize := make(map[int64]int64) + for id, col := range t.Cols() { + val := -int64(len(r[id].GetBytes())) + if val != 0 { + colSize[col.ID] = val + } + } + ctx.GetSessionVars().TxnCtx.UpdateDeltaForTable(t.physicalTableID, -1, 1, colSize) return errors.Trace(err) } diff --git a/table/tables/tables_test.go b/table/tables/tables_test.go index 0eccc2d025d0b..fd46a6428bdd6 100644 --- a/table/tables/tables_test.go +++ b/table/tables/tables_test.go @@ -17,9 +17,9 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" diff --git a/tablecodec/tablecodec.go b/tablecodec/tablecodec.go index ec07f38b0f05e..3f31f5613a9c3 100644 --- a/tablecodec/tablecodec.go +++ b/tablecodec/tablecodec.go @@ -19,10 +19,10 @@ import ( "math" "time" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pkg/errors" diff --git a/tablecodec/tablecodec_test.go b/tablecodec/tablecodec_test.go index 6ae12dc1b0b11..a68f26d6ef873 100644 --- a/tablecodec/tablecodec_test.go +++ b/tablecodec/tablecodec_test.go @@ -21,8 +21,8 @@ import ( gofail "github.com/etcd-io/gofail/runtime" . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" diff --git a/terror/terror.go b/terror/terror.go index 3cc1c2d17105c..c38e0e18a1b24 100644 --- a/terror/terror.go +++ b/terror/terror.go @@ -18,7 +18,7 @@ import ( "fmt" "strconv" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) diff --git a/tidb-server/main.go b/tidb-server/main.go index 44bddf593e4e0..57300d60b9436 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -24,12 +24,13 @@ import ( "time" "github.com/opentracing/opentracing-go" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/server" @@ -40,7 +41,6 @@ import ( "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/store/tikv/gcworker" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/printer" @@ -64,6 +64,7 @@ const ( nmHost = "host" nmAdvertiseAddress = "advertise-address" nmPort = "P" + nmCors = "cors" nmSocket = "socket" nmBinlogSocket = "binlog-socket" nmRunDDL = "run-ddl" @@ -91,6 +92,7 @@ var ( host = flag.String(nmHost, "0.0.0.0", "tidb server host") advertiseAddress = flag.String(nmAdvertiseAddress, "", "tidb server advertise IP") port = flag.String(nmPort, "4000", "tidb server port") + cors = flag.String(nmCors, "", "tidb server allow cors origin") socket = flag.String(nmSocket, "", "The socket file to use for connection.") binlogSocket = flag.String(nmBinlogSocket, "", "socket file to write binlog") runDDL = flagBoolean(nmRunDDL, true, "run ddl worker on this tidb-server") @@ -278,6 +280,10 @@ func overrideConfig() { terror.MustNil(err) cfg.Port = uint(p) } + if actualFlags[nmCors] { + fmt.Println(cors) + cfg.Cors = *cors + } if actualFlags[nmStore] { cfg.Store = *store } diff --git a/types/compare_test.go b/types/compare_test.go index 8bdd621b61ff3..cf51757fc637c 100644 --- a/types/compare_test.go +++ b/types/compare_test.go @@ -17,7 +17,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/util/testleak" ) diff --git a/types/convert.go b/types/convert.go index 8997426901b73..6698e135c383f 100644 --- a/types/convert.go +++ b/types/convert.go @@ -22,9 +22,9 @@ import ( "strconv" "strings" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/hack" "github.com/pkg/errors" diff --git a/types/convert_test.go b/types/convert_test.go index f74431f2ef843..010b22f3ba5bb 100644 --- a/types/convert_test.go +++ b/types/convert_test.go @@ -20,11 +20,11 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/testleak" "github.com/pkg/errors" ) @@ -464,7 +464,7 @@ func (s *testTypeConvertSuite) TestStrToNum(c *C) { func (s *testTypeConvertSuite) TestFieldTypeToStr(c *C) { defer testleak.AfterTest(c)() v := TypeToStr(mysql.TypeUnspecified, "not binary") - c.Assert(v, Equals, type2Str[mysql.TypeUnspecified]) + c.Assert(v, Equals, TypeStr(mysql.TypeUnspecified)) v = TypeToStr(mysql.TypeBlob, charset.CharsetBin) c.Assert(v, Equals, "blob") v = TypeToStr(mysql.TypeString, charset.CharsetBin) diff --git a/types/datum.go b/types/datum.go index 959231e633b0f..c6d4643c4c40a 100644 --- a/types/datum.go +++ b/types/datum.go @@ -22,11 +22,11 @@ import ( "time" "unicode/utf8" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/hack" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/types/datum_eval.go b/types/datum_eval.go index af8a7f993402b..9cbdaa4fa84fa 100644 --- a/types/datum_eval.go +++ b/types/datum_eval.go @@ -15,7 +15,7 @@ package types import ( "github.com/cznic/mathutil" - "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/parser/opcode" "github.com/pkg/errors" ) diff --git a/types/datum_test.go b/types/datum_test.go index bbb66780aae3f..a2d7a64739020 100644 --- a/types/datum_test.go +++ b/types/datum_test.go @@ -14,10 +14,12 @@ package types import ( + "reflect" + "testing" "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types/json" ) @@ -362,3 +364,39 @@ func (ts *testDatumSuite) TestCopyDatum(c *C) { } } } + +func prepareCompareDatums() ([]Datum, []Datum) { + vals := make([]Datum, 0, 5) + vals = append(vals, NewIntDatum(1)) + vals = append(vals, NewFloat64Datum(1.23)) + vals = append(vals, NewStringDatum("abcde")) + vals = append(vals, NewDecimalDatum(NewDecFromStringForTest("1.2345"))) + vals = append(vals, NewTimeDatum(Time{Time: FromGoTime(time.Date(2018, 3, 8, 16, 1, 0, 315313000, time.UTC)), Fsp: 6, Type: mysql.TypeTimestamp})) + + vals1 := make([]Datum, 0, 5) + vals1 = append(vals1, NewIntDatum(1)) + vals1 = append(vals1, NewFloat64Datum(1.23)) + vals1 = append(vals1, NewStringDatum("abcde")) + vals1 = append(vals1, NewDecimalDatum(NewDecFromStringForTest("1.2345"))) + vals1 = append(vals1, NewTimeDatum(Time{Time: FromGoTime(time.Date(2018, 3, 8, 16, 1, 0, 315313000, time.UTC)), Fsp: 6, Type: mysql.TypeTimestamp})) + return vals, vals1 +} + +func BenchmarkCompareDatum(b *testing.B) { + vals, vals1 := prepareCompareDatums() + sc := new(stmtctx.StatementContext) + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j, v := range vals { + v.CompareDatum(sc, &vals1[j]) + } + } +} + +func BenchmarkCompareDatumByReflect(b *testing.B) { + vals, vals1 := prepareCompareDatums() + b.ResetTimer() + for i := 0; i < b.N; i++ { + reflect.DeepEqual(vals, vals1) + } +} diff --git a/types/errors.go b/types/errors.go index 52558ea5f18d6..9e1919b45d97e 100644 --- a/types/errors.go +++ b/types/errors.go @@ -14,8 +14,9 @@ package types import ( - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + parser_types "github.com/pingcap/parser/types" ) var ( @@ -45,12 +46,12 @@ var ( ErrWrongFieldSpec = terror.ClassTypes.New(codeWrongFieldSpec, "Wrong Field Spec") // ErrBadNumber is return when parsing an invalid binary decimal number. ErrBadNumber = terror.ClassTypes.New(codeBadNumber, "Bad Number") + // ErrInvalidDefault is returned when meet a invalid default value. + ErrInvalidDefault = parser_types.ErrInvalidDefault // ErrCastAsSignedOverflow is returned when positive out-of-range integer, and convert to it's negative complement. ErrCastAsSignedOverflow = terror.ClassTypes.New(codeUnknown, msgCastAsSignedOverflow) // ErrCastNegIntAsUnsigned is returned when a negative integer be casted to an unsigned int. ErrCastNegIntAsUnsigned = terror.ClassTypes.New(codeUnknown, msgCastNegIntAsUnsigned) - // ErrInvalidDefault is returned when meet a invalid default value. - ErrInvalidDefault = terror.ClassTypes.New(codeInvalidDefault, "Invalid default value for '%s'") // ErrMBiggerThanD is returned when precision less than the scale. ErrMBiggerThanD = terror.ClassTypes.New(codeMBiggerThanD, mysql.MySQLErrName[mysql.ErrMBiggerThanD]) // ErrWarnDataOutOfRange is returned when the value in a numeric column that is outside the permissible range of the column data type. diff --git a/types/etc.go b/types/etc.go index 4f1bf1115d74e..626139a7d328a 100644 --- a/types/etc.go +++ b/types/etc.go @@ -19,30 +19,21 @@ package types import ( "io" - "strings" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/charset" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/terror" + ast "github.com/pingcap/parser/types" "github.com/pkg/errors" ) // 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 - } -} +var IsTypeBlob = ast.IsTypeBlob // 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 -} +var IsTypeChar = ast.IsTypeChar // IsTypeVarchar returns a boolean indicating // whether the tp is the varchar type like a varstring type or a varchar type. @@ -113,36 +104,6 @@ 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", @@ -166,9 +127,7 @@ var kind2Str = map[byte]string{ } // TypeStr converts tp to a string. -func TypeStr(tp byte) (r string) { - return type2Str[tp] -} +var TypeStr = ast.TypeStr // KindStr converts kind to a string. func KindStr(kind byte) (r string) { @@ -181,18 +140,7 @@ func KindStr(kind byte) (r string) { // Args: // tp: type enum // cs: charset -func TypeToStr(tp byte, cs string) (r string) { - ts := type2Str[tp] - if cs != charset.CharsetBin { - 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 -} +var TypeToStr = ast.TypeToStr // EOFAsNil filtrates errors, // If err is equal to io.EOF returns nil. diff --git a/types/etc_test.go b/types/etc_test.go index 4a5e161f2e32e..32de5aa88ee20 100644 --- a/types/etc_test.go +++ b/types/etc_test.go @@ -18,8 +18,8 @@ import ( "testing" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/util/testleak" ) @@ -122,7 +122,7 @@ func (s *testTypeEtcSuite) TestMaxFloat(c *C) { } for _, t := range tbl { - f := getMaxFloat(t.Flen, t.Decimal) + f := GetMaxFloat(t.Flen, t.Decimal) c.Assert(f, Equals, t.Expect) } } diff --git a/types/eval_type.go b/types/eval_type.go index 47775953d97c5..3eb17cae856f9 100644 --- a/types/eval_type.go +++ b/types/eval_type.go @@ -13,30 +13,26 @@ package types +import ast "github.com/pingcap/parser/types" + // EvalType indicates the specified types that arguments and result of a built-in function should be. -type EvalType byte +type EvalType = ast.EvalType const ( // ETInt represents type INT in evaluation. - ETInt EvalType = iota + ETInt = ast.ETInt // ETReal represents type REAL in evaluation. - ETReal + ETReal = ast.ETReal // ETDecimal represents type DECIMAL in evaluation. - ETDecimal + ETDecimal = ast.ETDecimal // ETString represents type STRING in evaluation. - ETString + ETString = ast.ETString // ETDatetime represents type DATETIME in evaluation. - ETDatetime + ETDatetime = ast.ETDatetime // ETTimestamp represents type TIMESTAMP in evaluation. - ETTimestamp + ETTimestamp = ast.ETTimestamp // ETDuration represents type DURATION in evaluation. - ETDuration + ETDuration = ast.ETDuration // ETJson represents type JSON in evaluation. - ETJson + ETJson = ast.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 index bb247ba8e7e20..9da5c8044a0fd 100644 --- a/types/field_type.go +++ b/types/field_type.go @@ -14,15 +14,12 @@ package types import ( - "fmt" - "io" "strconv" - "strings" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" + ast "github.com/pingcap/parser/types" "github.com/pingcap/tidb/types/json" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/format" ) // UnspecifiedLength is unspecified length. @@ -31,16 +28,7 @@ const ( ) // 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 -} +type FieldType = ast.FieldType // NewFieldType returns a FieldType, // with a type and other information about field type. @@ -52,27 +40,6 @@ func NewFieldType(tp byte) *FieldType { } } -// 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 -} - // AggFieldType aggregates field types for a multi-argument function like `IF`, `IFNULL`, `COALESCE` // whose return type is determined by the arguments' FieldTypes. // Aggregation is performed by MergeFieldType function. @@ -152,172 +119,6 @@ func setTypeFlag(flag *uint, flagItem uint, on bool) { } } -// 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") - } -} - // DefaultParamTypeForValue returns the default FieldType for the parameterized value. func DefaultParamTypeForValue(value interface{}, tp *FieldType) { switch value.(type) { @@ -1416,21 +1217,4 @@ func SetBinChsClnFlag(ft *FieldType) { } // 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 - } -} +const VarStorageLen = ast.VarStorageLen diff --git a/types/field_type_test.go b/types/field_type_test.go index 71a6ea2983f55..f1d0292270223 100644 --- a/types/field_type_test.go +++ b/types/field_type_test.go @@ -15,8 +15,8 @@ package types import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/charset" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/util/testleak" ) diff --git a/types/format_test.go b/types/format_test.go index fb9b199c1f61b..16fbf6a963971 100644 --- a/types/format_test.go +++ b/types/format_test.go @@ -15,7 +15,7 @@ package types_test import ( . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" ) diff --git a/types/helper.go b/types/helper.go index 385921f479b9d..ec95d824d2f1e 100644 --- a/types/helper.go +++ b/types/helper.go @@ -59,7 +59,8 @@ func Truncate(f float64, dec int) float64 { return math.Trunc(tmp) / shift } -func getMaxFloat(flen int, decimal int) float64 { +// GetMaxFloat gets the max float for given flen and decimal. +func GetMaxFloat(flen int, decimal int) float64 { intPartLen := flen - decimal f := math.Pow10(intPartLen) f -= math.Pow10(-decimal) @@ -74,7 +75,7 @@ func TruncateFloat(f float64, flen int, decimal int) (float64, error) { return 0, ErrOverflow.GenWithStackByArgs("DOUBLE", "") } - maxF := getMaxFloat(flen, decimal) + maxF := GetMaxFloat(flen, decimal) if !math.IsInf(f, 0) { f = Round(f, decimal) diff --git a/types/json/binary.go b/types/json/binary.go index 0d0cd022d0dbb..182c08dcd4683 100644 --- a/types/json/binary.go +++ b/types/json/binary.go @@ -25,7 +25,7 @@ import ( "strings" "unicode/utf8" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/util/hack" "github.com/pkg/errors" ) @@ -169,6 +169,16 @@ func (bj BinaryJSON) GetString() []byte { return bj.Value[lenLen : lenLen+int(strLen)] } +// GetKeys gets the keys of the object +func (bj BinaryJSON) GetKeys() BinaryJSON { + count := bj.GetElemCount() + ret := make([]BinaryJSON, 0, count) + for i := 0; i < count; i++ { + ret = append(ret, CreateBinary(string(bj.objectGetKey(i)))) + } + return buildBinaryArray(ret) +} + // GetElemCount gets the count of Object or Array. func (bj BinaryJSON) GetElemCount() int { return int(endian.Uint32(bj.Value)) diff --git a/types/json/constants.go b/types/json/constants.go index f5bc92daf336c..03c9a5aa7a5a2 100644 --- a/types/json/constants.go +++ b/types/json/constants.go @@ -17,8 +17,8 @@ import ( "encoding/binary" "unicode/utf8" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" ) // TypeCode indicates JSON type. diff --git a/types/mydecimal.go b/types/mydecimal.go index 97d037b80455b..dec19cfee333d 100644 --- a/types/mydecimal.go +++ b/types/mydecimal.go @@ -17,8 +17,8 @@ import ( "math" "strconv" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pkg/errors" ) diff --git a/types/parser_driver/value_expr.go b/types/parser_driver/value_expr.go new file mode 100644 index 0000000000000..09a8a8a1fb430 --- /dev/null +++ b/types/parser_driver/value_expr.go @@ -0,0 +1,177 @@ +// 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 driver + +import ( + "fmt" + "io" + "strconv" + + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/hack" +) + +// The purpose of driver package is to decompose the dependency of the parser and +// types package. +// It provides the NewValueExpr function for the ast package, so the ast package +// do not depends on the concrete definition of `types.Datum`, thus get rid of +// the dependency of the types package. +// The parser package depends on the ast package, but not the types package. +// The whole relationship: +// ast imports [] +// tidb/types imports [parser/types] +// parser imports [ast, parser/types] +// driver imports [ast, tidb/types] +// tidb imports [parser, driver] + +func init() { + ast.NewValueExpr = newValueExpr + ast.NewParamMarkerExpr = newParamMarkerExpr + ast.NewDecimal = func(str string) (interface{}, error) { + dec := new(types.MyDecimal) + err := dec.FromString(hack.Slice(str)) + return dec, err + } + ast.NewHexLiteral = func(str string) (interface{}, error) { + h, err := types.NewHexLiteral(str) + return h, err + } + ast.NewBitLiteral = func(str string) (interface{}, error) { + b, err := types.NewBitLiteral(str) + return b, err + } +} + +var ( + _ ast.ParamMarkerExpr = &ParamMarkerExpr{} + _ ast.ValueExpr = &ValueExpr{} +) + +// ValueExpr is the simple value expression. +type ValueExpr struct { + ast.TexprNode + types.Datum + projectionOffset int +} + +// GetDatumString implements the ast.ValueExpr interface. +func (n *ValueExpr) GetDatumString() string { + return n.GetString() +} + +// Format the ExprNode into a Writer. +func (n *ValueExpr) Format(w io.Writer) { + var s string + switch n.Kind() { + case types.KindNull: + s = "NULL" + case types.KindInt64: + if n.Type.Flag&mysql.IsBooleanFlag != 0 { + if n.GetInt64() > 0 { + s = "TRUE" + } else { + s = "FALSE" + } + } else { + s = strconv.FormatInt(n.GetInt64(), 10) + } + case types.KindUint64: + s = strconv.FormatUint(n.GetUint64(), 10) + case types.KindFloat32: + s = strconv.FormatFloat(n.GetFloat64(), 'e', -1, 32) + case types.KindFloat64: + s = strconv.FormatFloat(n.GetFloat64(), 'e', -1, 64) + case types.KindString, types.KindBytes: + s = strconv.Quote(n.GetString()) + case types.KindMysqlDecimal: + s = n.GetMysqlDecimal().String() + case types.KindBinaryLiteral: + if n.Type.Flag&mysql.UnsignedFlag != 0 { + s = fmt.Sprintf("x'%x'", n.GetBytes()) + } else { + s = n.GetBinaryLiteral().ToBitLiteralString(true) + } + default: + panic("Can't format to string") + } + fmt.Fprint(w, s) +} + +// newValueExpr creates a ValueExpr with value, and sets default field type. +func newValueExpr(value interface{}) ast.ValueExpr { + if ve, ok := value.(*ValueExpr); ok { + return ve + } + ve := &ValueExpr{} + ve.SetValue(value) + types.DefaultTypeForValue(value, &ve.Type) + ve.projectionOffset = -1 + return ve +} + +// SetProjectionOffset sets ValueExpr.projectionOffset for logical plan builder. +func (n *ValueExpr) SetProjectionOffset(offset int) { + n.projectionOffset = offset +} + +// GetProjectionOffset returns ValueExpr.projectionOffset. +func (n *ValueExpr) GetProjectionOffset() int { + return n.projectionOffset +} + +// Accept implements Node interface. +func (n *ValueExpr) Accept(v ast.Visitor) (ast.Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ValueExpr) + return v.Leave(n) +} + +// ParamMarkerExpr expression holds a place for another expression. +// Used in parsing prepare statement. +type ParamMarkerExpr struct { + ValueExpr + Offset int + Order int +} + +func newParamMarkerExpr(offset int) ast.ParamMarkerExpr { + return &ParamMarkerExpr{ + Offset: offset, + } +} + +// Format the ExprNode into a Writer. +func (n *ParamMarkerExpr) Format(w io.Writer) { + panic("Not implemented") +} + +// Accept implements Node Accept interface. +func (n *ParamMarkerExpr) Accept(v ast.Visitor) (ast.Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ParamMarkerExpr) + return v.Leave(n) +} + +// SetOrder implements the ast.ParamMarkerExpr interface. +func (n *ParamMarkerExpr) SetOrder(order int) { + n.Order = order +} diff --git a/types/time.go b/types/time.go index fa06db224e58a..c2694b2cd7ff1 100644 --- a/types/time.go +++ b/types/time.go @@ -23,9 +23,9 @@ import ( gotime "time" "unicode" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pkg/errors" log "github.com/sirupsen/logrus" ) @@ -682,6 +682,9 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo case 3: // YYYY-MM-DD err = scanTimeArgs(seps, &year, &month, &day) + case 4: + // YYYY-MM-DD HH + err = scanTimeArgs(seps, &year, &month, &day, &hour) case 5: // YYYY-MM-DD HH-MM err = scanTimeArgs(seps, &year, &month, &day, &hour, &minute) diff --git a/types/time_test.go b/types/time_test.go index 1e6698949e7f3..959d78bc6e76d 100644 --- a/types/time_test.go +++ b/types/time_test.go @@ -18,7 +18,7 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" @@ -62,6 +62,8 @@ func (s *testTimeSuite) TestDateTime(c *C) { {"170102036", "2017-01-02 03:06:00"}, {"170102039.", "2017-01-02 03:09:00"}, {"170102037.11", "2017-01-02 03:07:11.00"}, + {"2018-01-01 18", "2018-01-01 18:00:00"}, + {"18-01-01 18", "2018-01-01 18:00:00"}, } for _, test := range table { diff --git a/util/admin/admin.go b/util/admin/admin.go index 3e767f73021d3..a1985bd09a82c 100644 --- a/util/admin/admin.go +++ b/util/admin/admin.go @@ -16,23 +16,23 @@ package admin import ( "fmt" "io" - "reflect" "sort" + "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/rowDecoder" "github.com/pingcap/tidb/util/sqlexec" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -295,7 +295,7 @@ func ScanIndexData(sc *stmtctx.StatementContext, txn kv.Transaction, kvIndex tab // It returns nil if the data from the index is equal to the data from the table columns, // otherwise it returns an error with a different set of records. // genExprs is use to calculate the virtual generate column. -func CompareIndexData(sessCtx sessionctx.Context, txn kv.Transaction, t table.Table, idx table.Index, genExprs map[string]expression.Expression) error { +func CompareIndexData(sessCtx sessionctx.Context, txn kv.Transaction, t table.Table, idx table.Index, genExprs map[model.TableColumnID]expression.Expression) error { err := checkIndexAndRecord(sessCtx, txn, t, idx, genExprs) if err != nil { return errors.Trace(err) @@ -337,7 +337,7 @@ func adjustDatumKind(vals1, vals2 []types.Datum) { } } -func checkIndexAndRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table.Table, idx table.Index, genExprs map[string]expression.Expression) error { +func checkIndexAndRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table.Table, idx table.Index, genExprs map[model.TableColumnID]expression.Expression) error { it, err := idx.SeekFirst(txn) if err != nil { return errors.Trace(err) @@ -353,7 +353,8 @@ func checkIndexAndRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table if err != nil { return errors.Trace(err) } - sc := new(stmtctx.StatementContext) + rowDecoder := makeRowDecoder(t, cols, genExprs) + sc := sessCtx.GetSessionVars().StmtCtx for { vals1, h, err := it.Next() if terror.ErrorEqual(err, io.EOF) { @@ -366,7 +367,7 @@ func checkIndexAndRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table if err != nil { return errors.Trace(err) } - vals2, err := rowWithCols(sessCtx, txn, t, h, cols, genExprs) + vals2, err := rowWithCols(sessCtx, txn, t, h, cols, rowDecoder) vals2 = tables.TruncateIndexValuesIfNeeded(t.Meta(), idx.Meta(), vals2) if kv.ErrNotExist.Equal(err) { record := &RecordData{Handle: h, Values: vals1} @@ -391,22 +392,16 @@ func compareDatumSlice(sc *stmtctx.StatementContext, val1s, val2s []types.Datum) return false } for i, v := range val1s { - if v.Kind() == types.KindMysqlDecimal { - res, err := v.CompareDatum(sc, &val2s[i]) - if err != nil || res != 0 { - return false - } - } else { - if !reflect.DeepEqual(v, val2s[i]) { - return false - } + res, err := v.CompareDatum(sc, &val2s[i]) + if err != nil || res != 0 { + return false } } return true } // CheckRecordAndIndex is exported for testing. -func CheckRecordAndIndex(sessCtx sessionctx.Context, txn kv.Transaction, t table.Table, idx table.Index, genExprs map[string]expression.Expression) error { +func CheckRecordAndIndex(sessCtx sessionctx.Context, txn kv.Transaction, t table.Table, idx table.Index, genExprs map[model.TableColumnID]expression.Expression) error { sc := sessCtx.GetSessionVars().StmtCtx cols := make([]*table.Column, len(idx.Meta().Columns)) for i, col := range idx.Meta().Columns { @@ -523,6 +518,7 @@ func CompareTableRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table. } startKey := t.RecordKey(0) + sc := sessCtx.GetSessionVars().StmtCtx filterFunc := func(h int64, vals []types.Datum, cols []*table.Column) (bool, error) { vals2, ok := m[h] if !ok { @@ -534,7 +530,7 @@ func CompareTableRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table. return true, nil } - if !reflect.DeepEqual(vals, vals2) { + if !compareDatumSlice(sc, vals, vals2) { record1 := &RecordData{Handle: h, Values: vals2} record2 := &RecordData{Handle: h, Values: vals} return false, ErrDataInConsistent.GenWithStack("data:%#v != record:%#v", record1, record2) @@ -557,16 +553,38 @@ func CompareTableRecord(sessCtx sessionctx.Context, txn kv.Transaction, t table. return nil } +func makeRowDecoder(t table.Table, decodeCol []*table.Column, genExpr map[model.TableColumnID]expression.Expression) decoder.RowDecoder { + cols := t.Cols() + tblInfo := t.Meta() + decodeColsMap := make(map[int64]decoder.Column, len(decodeCol)) + for _, v := range decodeCol { + col := cols[v.Offset] + tpExpr := decoder.Column{ + Info: col.ToInfo(), + } + if col.IsGenerated() && !col.GeneratedStored { + for _, c := range cols { + if _, ok := col.Dependences[c.Name.L]; ok { + decodeColsMap[c.ID] = decoder.Column{ + Info: c.ToInfo(), + } + } + } + tpExpr.GenExpr = genExpr[model.TableColumnID{TableID: tblInfo.ID, ColumnID: col.ID}] + } + decodeColsMap[col.ID] = tpExpr + } + return decoder.NewRowDecoder(cols, decodeColsMap) +} + // genExprs use to calculate generated column value. -func rowWithCols(sessCtx sessionctx.Context, txn kv.Retriever, t table.Table, h int64, cols []*table.Column, genExprs map[string]expression.Expression) ([]types.Datum, error) { +func rowWithCols(sessCtx sessionctx.Context, txn kv.Retriever, t table.Table, h int64, cols []*table.Column, rowDecoder decoder.RowDecoder) ([]types.Datum, error) { key := t.RecordKey(h) value, err := txn.Get(key) - genColFlag := false if err != nil { return nil, errors.Trace(err) } v := make([]types.Datum, len(cols)) - colTps := make(map[int64]*types.FieldType, len(cols)) for i, col := range cols { if col == nil { continue @@ -582,34 +600,13 @@ func rowWithCols(sessCtx sessionctx.Context, txn kv.Retriever, t table.Table, h } continue } - // If have virtual generate column , decode all columns. - if col.IsGenerated() && col.GeneratedStored == false { - genColFlag = true - } - colTps[col.ID] = &col.FieldType - } - // if have virtual generate column, decode all columns - if genColFlag { - for _, c := range t.Cols() { - if c.State != model.StatePublic { - continue - } - colTps[c.ID] = &c.FieldType - } } - rowMap, err := tablecodec.DecodeRow(value, colTps, sessCtx.GetSessionVars().Location()) + rowMap, err := rowDecoder.DecodeAndEvalRowWithMap(sessCtx, value, sessCtx.GetSessionVars().Location(), time.UTC, nil) if err != nil { return nil, errors.Trace(err) } - if genColFlag && genExprs != nil { - err = fillGenColData(sessCtx, rowMap, t, cols, genExprs) - if err != nil { - return v, errors.Trace(err) - } - } - for i, col := range cols { if col == nil { continue @@ -641,7 +638,7 @@ func rowWithCols(sessCtx sessionctx.Context, txn kv.Retriever, t table.Table, h // genExprs use to calculate generated column value. func iterRecords(sessCtx sessionctx.Context, retriever kv.Retriever, t table.Table, startKey kv.Key, cols []*table.Column, - fn table.RecordIterFunc, genExprs map[string]expression.Expression) error { + fn table.RecordIterFunc, genExprs map[model.TableColumnID]expression.Expression) error { it, err := retriever.Seek(startKey) if err != nil { return errors.Trace(err) @@ -653,22 +650,7 @@ func iterRecords(sessCtx sessionctx.Context, retriever kv.Retriever, t table.Tab } log.Debugf("startKey:%q, key:%q, value:%q", startKey, it.Key(), it.Value()) - - genColFlag := false - colMap := make(map[int64]*types.FieldType, len(cols)) - for _, col := range cols { - if col.IsGenerated() && col.GeneratedStored == false { - genColFlag = true - break - } - colMap[col.ID] = &col.FieldType - } - if genColFlag { - for _, col := range t.Cols() { - colMap[col.ID] = &col.FieldType - } - } - + rowDecoder := makeRowDecoder(t, cols, genExprs) prefix := t.RecordPrefix() for it.Valid() && it.Key().HasPrefix(prefix) { // first kv pair is row lock information. @@ -679,18 +661,10 @@ func iterRecords(sessCtx sessionctx.Context, retriever kv.Retriever, t table.Tab return errors.Trace(err) } - rowMap, err := tablecodec.DecodeRow(it.Value(), colMap, sessCtx.GetSessionVars().Location()) + rowMap, err := rowDecoder.DecodeAndEvalRowWithMap(sessCtx, it.Value(), sessCtx.GetSessionVars().Location(), time.UTC, nil) if err != nil { return errors.Trace(err) } - - if genColFlag && genExprs != nil { - err = fillGenColData(sessCtx, rowMap, t, cols, genExprs) - if err != nil { - return errors.Trace(err) - } - } - data := make([]types.Datum, 0, len(cols)) for _, col := range cols { if col.IsPKHandleColumn(t.Meta()) { @@ -718,39 +692,6 @@ func iterRecords(sessCtx sessionctx.Context, retriever kv.Retriever, t table.Tab return nil } -// genExprs use to calculate generated column value. -func fillGenColData(sessCtx sessionctx.Context, rowMap map[int64]types.Datum, t table.Table, cols []*table.Column, genExprs map[string]expression.Expression) error { - tableInfo := t.Meta() - row := make([]types.Datum, len(t.Cols())) - for _, col := range t.Cols() { - ri, ok := rowMap[col.ID] - if ok { - row[col.Offset] = ri - } - } - - var err error - for _, col := range cols { - if !col.IsGenerated() || col.GeneratedStored == true { - continue - } - genColumnName := model.GetTableColumnID(tableInfo, col.ColumnInfo) - if expr, ok := genExprs[genColumnName]; ok { - var val types.Datum - val, err = expr.Eval(chunk.MutRowFromDatums(row).ToRow()) - if err != nil { - return errors.Trace(err) - } - val, err = table.CastValue(sessCtx, val, col.ToInfo()) - if err != nil { - return errors.Trace(err) - } - rowMap[col.ID] = val - } - } - return nil -} - // admin error codes. const ( codeDataNotEqual terror.ErrCode = 1 diff --git a/util/admin/admin_test.go b/util/admin/admin_test.go index 1e88fe08a67bc..d678f7d4543fc 100644 --- a/util/admin/admin_test.go +++ b/util/admin/admin_test.go @@ -19,10 +19,10 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" diff --git a/util/auth/auth_test.go b/util/auth/auth_test.go deleted file mode 100644 index 86cdd11eda0d9..0000000000000 --- a/util/auth/auth_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// 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/util/charset/charset_test.go b/util/charset/charset_test.go deleted file mode 100644 index c400d97f183be..0000000000000 --- a/util/charset/charset_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// 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/util/chunk/chunk.go b/util/chunk/chunk.go index d09150f1ab84b..3b91cf3bb693d 100644 --- a/util/chunk/chunk.go +++ b/util/chunk/chunk.go @@ -15,6 +15,7 @@ package chunk import ( "encoding/binary" + "reflect" "unsafe" "github.com/cznic/mathutil" @@ -277,6 +278,74 @@ func (c *Chunk) AppendPartialRow(colIdx int, row Row) { } } +// PreAlloc pre-allocates the memory space in a Chunk to store the Row. +// NOTE: +// 1. The Chunk must be empty or holds no useful data. +// 2. The schema of the Row must be the same with the Chunk. +// 3. This API is paired with the `Insert()` function, which inserts all the +// rows data into the Chunk after the pre-allocation. +// 4. We set the null bitmap here instead of in the Insert() function because +// when the Insert() function is called parallelly, the data race on a byte +// can not be avoided although the manipulated bits are different inside a +// byte. +func (c *Chunk) PreAlloc(row Row) { + for i, srcCol := range row.c.columns { + dstCol := c.columns[i] + dstCol.appendNullBitmap(!srcCol.isNull(row.idx)) + elemLen := len(srcCol.elemBuf) + if !srcCol.isFixed() { + elemLen = int(srcCol.offsets[row.idx+1] - srcCol.offsets[row.idx]) + dstCol.offsets = append(dstCol.offsets, int32(len(dstCol.data)+elemLen)) + } + dstCol.length++ + needCap := len(dstCol.data) + elemLen + if needCap <= cap(dstCol.data) { + (*reflect.SliceHeader)(unsafe.Pointer(&dstCol.data)).Len = len(dstCol.data) + elemLen + continue + } + // Grow the capacity according to golang.growslice. + newCap := cap(dstCol.data) + doubleCap := newCap << 1 + if needCap > doubleCap { + newCap = needCap + } else { + if len(dstCol.data) < 1024 { + newCap = doubleCap + } else { + for 0 < newCap && newCap < needCap { + newCap += newCap / 4 + } + if newCap <= 0 { + newCap = needCap + } + } + } + dstCol.data = make([]byte, len(dstCol.data)+elemLen, newCap) + } +} + +// Insert inserts `row` on the position specified by `rowIdx`. +// Note: Insert will cover the origin data, it should be called after +// PreAlloc. +func (c *Chunk) Insert(rowIdx int, row Row) { + for i, srcCol := range row.c.columns { + if row.IsNull(i) { + continue + } + dstCol := c.columns[i] + var srcStart, srcEnd, destStart, destEnd int + if srcCol.isFixed() { + srcElemLen, destElemLen := len(srcCol.elemBuf), len(dstCol.elemBuf) + srcStart, destStart = row.idx*srcElemLen, rowIdx*destElemLen + srcEnd, destEnd = srcStart+srcElemLen, destStart+destElemLen + } else { + srcStart, srcEnd = int(srcCol.offsets[row.idx]), int(srcCol.offsets[row.idx+1]) + destStart, destEnd = int(dstCol.offsets[rowIdx]), int(dstCol.offsets[rowIdx+1]) + } + copy(dstCol.data[destStart:destEnd], srcCol.data[srcStart:srcEnd]) + } +} + // Append appends rows in [begin, end) in another Chunk to a Chunk. func (c *Chunk) Append(other *Chunk, begin, end int) { for colID, src := range other.columns { diff --git a/util/chunk/chunk_test.go b/util/chunk/chunk_test.go index 799a6e703ca64..b78be4ad67f5c 100644 --- a/util/chunk/chunk_test.go +++ b/util/chunk/chunk_test.go @@ -18,12 +18,14 @@ import ( "fmt" "math" "strconv" + "strings" + "sync" "testing" "time" "unsafe" "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" @@ -517,6 +519,107 @@ func (s *testChunkSuite) TestSwapColumn(c *check.C) { checkRef() } +func (s *testChunkSuite) TestPreAlloc4RowAndInsert(c *check.C) { + fieldTypes := make([]*types.FieldType, 0, 4) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeLonglong}) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeNewDecimal}) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeVarchar}) + + srcChk := NewChunkWithCapacity(fieldTypes, 10) + for i := int64(0); i < 10; i++ { + srcChk.AppendFloat32(0, float32(i)) + srcChk.AppendInt64(1, i) + srcChk.AppendMyDecimal(2, types.NewDecFromInt(i)) + srcChk.AppendString(3, strings.Repeat(strconv.FormatInt(i, 10), int(i))) + } + + destChk := NewChunkWithCapacity(fieldTypes, 3) + + // Test Chunk.PreAlloc. + for i := 0; i < srcChk.NumRows(); i++ { + c.Assert(destChk.NumRows(), check.Equals, i) + destChk.PreAlloc(srcChk.GetRow(i)) + } + for i, srcCol := range srcChk.columns { + destCol := destChk.columns[i] + c.Assert(len(srcCol.elemBuf), check.Equals, len(destCol.elemBuf)) + c.Assert(len(srcCol.data), check.Equals, len(destCol.data)) + c.Assert(len(srcCol.offsets), check.Equals, len(destCol.offsets)) + c.Assert(len(srcCol.nullBitmap), check.Equals, len(destCol.nullBitmap)) + c.Assert(srcCol.length, check.Equals, destCol.length) + c.Assert(srcCol.nullCount, check.Equals, destCol.nullCount) + + for _, val := range destCol.data { + c.Assert(val == 0, check.IsTrue) + } + for j, val := range srcCol.offsets { + c.Assert(val, check.Equals, destCol.offsets[j]) + } + for j, val := range srcCol.nullBitmap { + c.Assert(val, check.Equals, destCol.nullBitmap[j]) + } + for _, val := range destCol.elemBuf { + c.Assert(val == 0, check.IsTrue) + } + } + + // Test Chunk.Insert. + for i := srcChk.NumRows() - 1; i >= 0; i-- { + destChk.Insert(i, srcChk.GetRow(i)) + } + for i, srcCol := range srcChk.columns { + destCol := destChk.columns[i] + + for j, val := range srcCol.data { + c.Assert(val, check.Equals, destCol.data[j]) + } + for j, val := range srcCol.offsets { + c.Assert(val, check.Equals, destCol.offsets[j]) + } + for j, val := range srcCol.nullBitmap { + c.Assert(val, check.Equals, destCol.nullBitmap[j]) + } + for _, val := range destCol.elemBuf { + c.Assert(val == 0, check.IsTrue) + } + } + + // Test parallel Chunk.Insert. + destChk.Reset() + startWg, endWg := &sync.WaitGroup{}, &sync.WaitGroup{} + startWg.Add(1) + for i := 0; i < srcChk.NumRows(); i++ { + destChk.PreAlloc(srcChk.GetRow(i)) + endWg.Add(1) + go func(rowIdx int) { + defer func() { + endWg.Done() + }() + startWg.Wait() + destChk.Insert(rowIdx, srcChk.GetRow(rowIdx)) + }(i) + } + startWg.Done() + endWg.Wait() + for i, srcCol := range srcChk.columns { + destCol := destChk.columns[i] + + for j, val := range srcCol.data { + c.Assert(val, check.Equals, destCol.data[j]) + } + for j, val := range srcCol.offsets { + c.Assert(val, check.Equals, destCol.offsets[j]) + } + for j, val := range srcCol.nullBitmap { + c.Assert(val, check.Equals, destCol.nullBitmap[j]) + } + for _, val := range destCol.elemBuf { + c.Assert(val == 0, check.IsTrue) + } + } +} + func BenchmarkAppendInt(b *testing.B) { b.ReportAllocs() chk := newChunk(8) diff --git a/util/chunk/codec.go b/util/chunk/codec.go index 20401f95f762b..43a5f5b17327d 100644 --- a/util/chunk/codec.go +++ b/util/chunk/codec.go @@ -19,7 +19,7 @@ import ( "unsafe" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" ) diff --git a/util/chunk/codec_test.go b/util/chunk/codec_test.go index 99aa4027647d1..abf5351784cc8 100644 --- a/util/chunk/codec_test.go +++ b/util/chunk/codec_test.go @@ -18,7 +18,7 @@ import ( "testing" "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/hack" diff --git a/util/chunk/compare.go b/util/chunk/compare.go index 60dc70ced817b..a8adbfc4174a9 100644 --- a/util/chunk/compare.go +++ b/util/chunk/compare.go @@ -16,7 +16,7 @@ package chunk import ( "sort" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" ) diff --git a/util/chunk/iterator_test.go b/util/chunk/iterator_test.go index eb4f9d7c04cf7..5438f062a1383 100644 --- a/util/chunk/iterator_test.go +++ b/util/chunk/iterator_test.go @@ -15,7 +15,7 @@ package chunk import ( "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" ) diff --git a/util/chunk/list.go b/util/chunk/list.go index da789211d5a0d..4acee7d199216 100644 --- a/util/chunk/list.go +++ b/util/chunk/list.go @@ -140,6 +140,37 @@ func (l *List) Reset() { l.consumedIdx = -1 } +// PreAlloc4Row pre-allocates the storage memory for a Row. +// NOTE: +// 1. The List must be empty or holds no useful data. +// 2. The schema of the Row must be the same with the List. +// 3. This API is paired with the `Insert()` function, which inserts all the +// rows data into the List after the pre-allocation. +func (l *List) PreAlloc4Row(row Row) (ptr RowPtr) { + chkIdx := len(l.chunks) - 1 + if chkIdx == -1 || l.chunks[chkIdx].NumRows() >= l.chunks[chkIdx].Capacity() { + newChk := l.allocChunk() + l.chunks = append(l.chunks, newChk) + if chkIdx != l.consumedIdx { + l.memTracker.Consume(l.chunks[chkIdx].MemoryUsage()) + l.consumedIdx = chkIdx + } + chkIdx++ + } + chk := l.chunks[chkIdx] + rowIdx := chk.NumRows() + chk.PreAlloc(row) + l.length++ + return RowPtr{ChkIdx: uint32(chkIdx), RowIdx: uint32(rowIdx)} +} + +// Insert inserts `row` on the position specified by `ptr`. +// Note: Insert will cover the origin data, it should be called after +// PreAlloc. +func (l *List) Insert(ptr RowPtr, row Row) { + l.chunks[ptr.ChkIdx].Insert(int(ptr.RowIdx), row) +} + // ListWalkFunc is used to walk the list. // If error is returned, it will stop walking. type ListWalkFunc = func(row Row) error diff --git a/util/chunk/list_test.go b/util/chunk/list_test.go index 646812331ceb8..9669e784a9e2b 100644 --- a/util/chunk/list_test.go +++ b/util/chunk/list_test.go @@ -15,11 +15,13 @@ package chunk import ( "math" + "strconv" + "strings" "testing" "time" "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" ) @@ -114,6 +116,47 @@ func (s *testChunkSuite) TestListMemoryUsage(c *check.C) { c.Assert(list.GetMemTracker().BytesConsumed(), check.Equals, memUsage+srcChk.MemoryUsage()) } +func (s *testChunkSuite) TestListPrePreAlloc4RowAndInsert(c *check.C) { + fieldTypes := make([]*types.FieldType, 0, 4) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeLonglong}) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeNewDecimal}) + fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeVarchar}) + + srcChk := NewChunkWithCapacity(fieldTypes, 10) + for i := int64(0); i < 10; i++ { + srcChk.AppendFloat32(0, float32(i)) + srcChk.AppendInt64(1, i) + srcChk.AppendMyDecimal(2, types.NewDecFromInt(i)) + srcChk.AppendString(3, strings.Repeat(strconv.FormatInt(i, 10), int(i))) + } + + srcList := NewList(fieldTypes, 3, 3) + destList := NewList(fieldTypes, 5, 5) + destRowPtr := make([]RowPtr, srcChk.NumRows()) + for i := 0; i < srcChk.NumRows(); i++ { + srcList.AppendRow(srcChk.GetRow(i)) + destRowPtr[i] = destList.PreAlloc4Row(srcChk.GetRow(i)) + } + + c.Assert(srcList.NumChunks(), check.Equals, 4) + c.Assert(destList.NumChunks(), check.Equals, 2) + + iter4Src := NewIterator4List(srcList) + for row, i := iter4Src.Begin(), 0; row != iter4Src.End(); row, i = iter4Src.Next(), i+1 { + destList.Insert(destRowPtr[i], row) + } + + iter4Dest := NewIterator4List(destList) + srcRow, destRow := iter4Src.Begin(), iter4Dest.Begin() + for ; srcRow != iter4Src.End(); srcRow, destRow = iter4Src.Next(), iter4Dest.Next() { + c.Assert(srcRow.GetFloat32(0), check.Equals, destRow.GetFloat32(0)) + c.Assert(srcRow.GetInt64(1), check.Equals, destRow.GetInt64(1)) + c.Assert(srcRow.GetMyDecimal(2).Compare(destRow.GetMyDecimal(2)) == 0, check.IsTrue) + c.Assert(srcRow.GetString(3), check.Equals, destRow.GetString(3)) + } +} + func BenchmarkListMemoryUsage(b *testing.B) { fieldTypes := make([]*types.FieldType, 0, 4) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) diff --git a/util/chunk/mutrow.go b/util/chunk/mutrow.go index 1eba29a2f9e5c..17a3c4f4dd31c 100644 --- a/util/chunk/mutrow.go +++ b/util/chunk/mutrow.go @@ -18,7 +18,7 @@ import ( "math" "unsafe" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/hack" diff --git a/util/chunk/mutrow_test.go b/util/chunk/mutrow_test.go index bf2e925c7fb41..1405773f027f4 100644 --- a/util/chunk/mutrow_test.go +++ b/util/chunk/mutrow_test.go @@ -18,7 +18,7 @@ import ( "time" "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" diff --git a/util/chunk/row.go b/util/chunk/row.go index dcf573eea66b5..df2bd96df91f6 100644 --- a/util/chunk/row.go +++ b/util/chunk/row.go @@ -17,7 +17,7 @@ import ( "time" "unsafe" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/hack" diff --git a/util/codec/bench_test.go b/util/codec/bench_test.go index 4929458dcf994..0dd8d2d05b5d3 100644 --- a/util/codec/bench_test.go +++ b/util/codec/bench_test.go @@ -16,7 +16,7 @@ package codec import ( "testing" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" ) diff --git a/util/codec/codec.go b/util/codec/codec.go index 01d330ae8f68e..80839b5ca5340 100644 --- a/util/codec/codec.go +++ b/util/codec/codec.go @@ -17,9 +17,9 @@ import ( "encoding/binary" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/util/codec/codec_test.go b/util/codec/codec_test.go index bca3923d19644..86679c9052bdd 100644 --- a/util/codec/codec_test.go +++ b/util/codec/codec_test.go @@ -20,9 +20,9 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" diff --git a/util/disjointset/int_set.go b/util/disjointset/int_set.go new file mode 100644 index 0000000000000..0881b4aa1b03f --- /dev/null +++ b/util/disjointset/int_set.go @@ -0,0 +1,42 @@ +// 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 disjointset + +// IntSet is the int disjoint set. +type IntSet struct { + parent []int +} + +// NewIntSet returns a new int disjoint set. +func NewIntSet(size int) *IntSet { + p := make([]int, size) + for i := range p { + p[i] = i + } + return &IntSet{parent: p} +} + +// Union unions two sets in int disjoint set. +func (m *IntSet) Union(a int, b int) { + m.parent[m.FindRoot(a)] = m.FindRoot(b) +} + +// FindRoot finds the representative element of the set that `a` belongs to. +func (m *IntSet) FindRoot(a int) int { + if a == m.parent[a] { + return a + } + m.parent[a] = m.FindRoot(m.parent[a]) + return m.parent[a] +} diff --git a/util/disjointset/int_set_test.go b/util/disjointset/int_set_test.go new file mode 100644 index 0000000000000..222c63ec5fc9f --- /dev/null +++ b/util/disjointset/int_set_test.go @@ -0,0 +1,52 @@ +// 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 disjointset + +import ( + "testing" + + . "github.com/pingcap/check" +) + +var _ = Suite(&testDisjointSetSuite{}) + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +type testDisjointSetSuite struct { +} + +func (s *testDisjointSetSuite) TestIntDisjointSet(c *C) { + set := NewIntSet(10) + c.Assert(len(set.parent), Equals, 10) + for i := range set.parent { + c.Assert(set.parent[i], Equals, i) + } + set.Union(0, 1) + set.Union(1, 3) + set.Union(4, 2) + set.Union(2, 6) + set.Union(3, 5) + set.Union(7, 8) + set.Union(9, 6) + c.Assert(set.FindRoot(0), Equals, set.FindRoot(1)) + c.Assert(set.FindRoot(3), Equals, set.FindRoot(1)) + c.Assert(set.FindRoot(5), Equals, set.FindRoot(1)) + c.Assert(set.FindRoot(2), Equals, set.FindRoot(4)) + c.Assert(set.FindRoot(6), Equals, set.FindRoot(4)) + c.Assert(set.FindRoot(9), Equals, set.FindRoot(2)) + c.Assert(set.FindRoot(7), Equals, set.FindRoot(8)) +} diff --git a/util/execdetails/execdetails.go b/util/execdetails/execdetails.go index 3eb55c9a47702..ad384c51e0a7b 100644 --- a/util/execdetails/execdetails.go +++ b/util/execdetails/execdetails.go @@ -14,9 +14,9 @@ package execdetails import ( - "bytes" "fmt" "strings" + "sync" "sync/atomic" "time" ) @@ -55,11 +55,14 @@ func (d ExecDetails) String() string { return strings.Join(parts, " ") } -// RuntimeStats collects executors's execution info. -type RuntimeStats map[string]*RuntimeStat +// RuntimeStatsColl collects executors's execution info. +type RuntimeStatsColl struct { + mu sync.Mutex + stats map[string]*RuntimeStats +} -// RuntimeStat collects one executor's execution info. -type RuntimeStat struct { +// RuntimeStats collects one executor's execution info. +type RuntimeStats struct { // executor's Next() called times. loop int32 // executor consume time. @@ -68,44 +71,33 @@ type RuntimeStat struct { rows int64 } -// NewRuntimeStats creates new executor collector. -func NewRuntimeStats() RuntimeStats { - return RuntimeStats(make(map[string]*RuntimeStat)) +// NewRuntimeStatsColl creates new executor collector. +func NewRuntimeStatsColl() *RuntimeStatsColl { + return &RuntimeStatsColl{stats: make(map[string]*RuntimeStats)} } -// GetRuntimeStat gets execStat for a executor. -func (e RuntimeStats) GetRuntimeStat(planID string) *RuntimeStat { - if e == nil { - return nil - } - runtimecStat, exists := e[planID] +// Get gets execStat for a executor. +func (e *RuntimeStatsColl) Get(planID string) *RuntimeStats { + e.mu.Lock() + defer e.mu.Unlock() + runtimeStats, exists := e.stats[planID] if !exists { - runtimecStat = &RuntimeStat{} - e[planID] = runtimecStat - } - return runtimecStat -} - -func (e RuntimeStats) String() string { - var buff bytes.Buffer - buff.WriteString("(") - for planID, stat := range e { - buff.WriteString(planID + ":" + stat.String() + ",") + runtimeStats = &RuntimeStats{} + e.stats[planID] = runtimeStats } - buff.WriteString(")") - return buff.String() + return runtimeStats } // Record records executor's execution. -func (e *RuntimeStat) Record(d time.Duration, rowNum int) { +func (e *RuntimeStats) Record(d time.Duration, rowNum int) { atomic.AddInt32(&e.loop, 1) atomic.AddInt64(&e.consume, int64(d)) atomic.AddInt64(&e.rows, int64(rowNum)) } -func (e *RuntimeStat) String() string { +func (e *RuntimeStats) String() string { if e == nil { return "" } - return fmt.Sprintf("time:%f, loops:%d, rows:%d", time.Duration(e.consume).Seconds()*1e3, e.loop, e.rows) + return fmt.Sprintf("time:%v, loops:%d, rows:%d", time.Duration(e.consume), e.loop, e.rows) } diff --git a/util/filesort/filesort.go b/util/filesort/filesort.go index 6701ca825324e..5b61cc904b7c2 100644 --- a/util/filesort/filesort.go +++ b/util/filesort/filesort.go @@ -25,8 +25,8 @@ import ( "sync/atomic" "time" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pkg/errors" diff --git a/util/kvencoder/kv_encoder.go b/util/kvencoder/kv_encoder.go index 9fb4167172619..9184e0d439aec 100644 --- a/util/kvencoder/kv_encoder.go +++ b/util/kvencoder/kv_encoder.go @@ -20,11 +20,11 @@ import ( "sync" "sync/atomic" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/tablecodec" diff --git a/util/kvencoder/kv_encoder_test.go b/util/kvencoder/kv_encoder_test.go index fcd50e0820edf..18fb8d5663e34 100644 --- a/util/kvencoder/kv_encoder_test.go +++ b/util/kvencoder/kv_encoder_test.go @@ -49,6 +49,7 @@ func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { return nil, nil, errors.Trace(err) } session.SetSchemaLease(0) + session.SetStatsLease(0) dom, err := session.BootstrapSession(store) return store, dom, errors.Trace(err) } diff --git a/util/memory/action.go b/util/memory/action.go index 1873d3c2cca24..7e8ddaf49ded1 100644 --- a/util/memory/action.go +++ b/util/memory/action.go @@ -16,8 +16,8 @@ package memory import ( "sync" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" log "github.com/sirupsen/logrus" ) diff --git a/util/mock/context.go b/util/mock/context.go index 2eb7631e16769..e33879460288b 100644 --- a/util/mock/context.go +++ b/util/mock/context.go @@ -19,7 +19,6 @@ import ( "sync" "time" - "github.com/pingcap/tidb/ast" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/sessionctx" @@ -50,7 +49,7 @@ type Context struct { } // Execute implements sqlexec.SQLExecutor Execute interface. -func (c *Context) Execute(ctx context.Context, sql string) ([]ast.RecordSet, error) { +func (c *Context) Execute(ctx context.Context, sql string) ([]sqlexec.RecordSet, error) { return nil, errors.Errorf("Not Support.") } diff --git a/util/printer/printer.go b/util/printer/printer.go index 510c87c2592da..fdae8b19f32bc 100644 --- a/util/printer/printer.go +++ b/util/printer/printer.go @@ -18,8 +18,8 @@ import ( "encoding/json" "fmt" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/util/israce" log "github.com/sirupsen/logrus" ) diff --git a/util/ranger/checker.go b/util/ranger/checker.go index 6973d6bec8304..74ea582ca94de 100644 --- a/util/ranger/checker.go +++ b/util/ranger/checker.go @@ -14,9 +14,9 @@ package ranger import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/types" ) diff --git a/util/ranger/detacher.go b/util/ranger/detacher.go index 31be5566d0843..529f4cb92c9a8 100644 --- a/util/ranger/detacher.go +++ b/util/ranger/detacher.go @@ -14,9 +14,9 @@ package ranger import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pkg/errors" diff --git a/util/ranger/points.go b/util/ranger/points.go index 4f31943d88f53..0b830545e578f 100644 --- a/util/ranger/points.go +++ b/util/ranger/points.go @@ -18,11 +18,11 @@ import ( "math" "sort" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pkg/errors" diff --git a/util/ranger/ranger.go b/util/ranger/ranger.go index 2a7c1ca87d7b4..5631c1ff7c995 100644 --- a/util/ranger/ranger.go +++ b/util/ranger/ranger.go @@ -19,14 +19,14 @@ import ( "sort" "unicode/utf8" - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/charset" "github.com/pingcap/tidb/util/codec" "github.com/pkg/errors" ) diff --git a/util/ranger/ranger_test.go b/util/ranger/ranger_test.go index 56ec9261417d3..8947aec481cc5 100644 --- a/util/ranger/ranger_test.go +++ b/util/ranger/ranger_test.go @@ -18,10 +18,10 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/pingcap/parser" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" diff --git a/util/rowDecoder/decoder.go b/util/rowDecoder/decoder.go index 38137a3997537..86d69fa1e457f 100644 --- a/util/rowDecoder/decoder.go +++ b/util/rowDecoder/decoder.go @@ -16,9 +16,9 @@ package decoder import ( "time" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" @@ -71,7 +71,7 @@ func NewRowDecoder(cols []*table.Column, decodeColMap map[int64]Column) RowDecod // DecodeAndEvalRowWithMap decodes a byte slice into datums and evaluates the generated column value. func (rd RowDecoder) DecodeAndEvalRowWithMap(ctx sessionctx.Context, b []byte, decodeLoc, sysLoc *time.Location, row map[int64]types.Datum) (map[int64]types.Datum, error) { - _, err := tablecodec.DecodeRowWithMap(b, rd.colTypes, decodeLoc, row) + row, err := tablecodec.DecodeRowWithMap(b, rd.colTypes, decodeLoc, row) if err != nil { return nil, errors.Trace(err) } @@ -96,9 +96,9 @@ func (rd RowDecoder) DecodeAndEvalRowWithMap(ctx sessionctx.Context, b []byte, d return nil, errors.Trace(err) } - if val.Kind() == types.KindMysqlTime { + if val.Kind() == types.KindMysqlTime && sysLoc != time.UTC { t := val.GetMysqlTime() - if t.Type == mysql.TypeTimestamp && sysLoc != time.UTC { + if t.Type == mysql.TypeTimestamp { err := t.ConvertTimeZone(sysLoc, time.UTC) if err != nil { return nil, errors.Trace(err) diff --git a/util/sqlexec/restricted_sql_executor.go b/util/sqlexec/restricted_sql_executor.go index e95574ea8c354..672845de616bc 100644 --- a/util/sqlexec/restricted_sql_executor.go +++ b/util/sqlexec/restricted_sql_executor.go @@ -14,7 +14,7 @@ package sqlexec import ( - "github.com/pingcap/tidb/ast" + "github.com/pingcap/parser/ast" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" "golang.org/x/net/context" @@ -42,7 +42,7 @@ type RestrictedSQLExecutor interface { // For example, privilege/privileges package need execute SQL, if it use // session.Session.Execute, then privilege/privileges and tidb would become a circle. type SQLExecutor interface { - Execute(ctx context.Context, sql string) ([]ast.RecordSet, error) + Execute(ctx context.Context, sql string) ([]RecordSet, error) } // SQLParser is an interface provides parsing sql statement. @@ -52,3 +52,41 @@ type SQLExecutor interface { type SQLParser interface { ParseSQL(sql, charset, collation string) ([]ast.StmtNode, error) } + +// Statement is an interface for SQL execution. +// NOTE: all Statement implementations must be safe for +// concurrent using by multiple goroutines. +// If the Exec method requires any Execution domain local data, +// they must be held out of the implementing instance. +type Statement interface { + // OriginText gets the origin SQL text. + OriginText() string + + // Exec executes SQL and gets a Recordset. + Exec(ctx context.Context) (RecordSet, error) + + // IsPrepared returns whether this statement is prepared statement. + IsPrepared() bool + + // IsReadOnly returns if the statement is read only. For example: SelectStmt without lock. + IsReadOnly() bool + + // RebuildPlan rebuilds the plan of the statement. + RebuildPlan() (schemaVersion int64, err error) +} + +// RecordSet is an abstract result set interface to help get data from Plan. +type RecordSet interface { + // Fields gets result fields. + Fields() []*ast.ResultField + + // Next reads records into chunk. + Next(ctx context.Context, chk *chunk.Chunk) error + + // NewChunk creates a new chunk with initial capacity. + NewChunk() *chunk.Chunk + + // Close closes the underlying iterator, call Next after Close will + // restart the iteration. + Close() error +} diff --git a/util/testkit/testkit.go b/util/testkit/testkit.go index 08cc9a2d87355..cea25aab3ef75 100644 --- a/util/testkit/testkit.go +++ b/util/testkit/testkit.go @@ -20,9 +20,9 @@ import ( "sync/atomic" "github.com/pingcap/check" - "github.com/pingcap/tidb/ast" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testutil" "github.com/pkg/errors" "golang.org/x/net/context" @@ -123,7 +123,7 @@ func NewTestKitWithInit(c *check.C, store kv.Storage) *TestKit { var connectionID uint64 // Exec executes a sql statement. -func (tk *TestKit) Exec(sql string, args ...interface{}) (ast.RecordSet, error) { +func (tk *TestKit) Exec(sql string, args ...interface{}) (sqlexec.RecordSet, error) { var err error if tk.Se == nil { tk.Se, err = session.CreateSession4Test(tk.store) @@ -133,7 +133,7 @@ func (tk *TestKit) Exec(sql string, args ...interface{}) (ast.RecordSet, error) } ctx := context.Background() if len(args) == 0 { - var rss []ast.RecordSet + var rss []sqlexec.RecordSet rss, err = tk.Se.Execute(ctx, sql) if err == nil && len(rss) > 0 { return rss[0], nil @@ -180,9 +180,9 @@ func (tk *TestKit) MustQuery(sql string, args ...interface{}) *Result { return tk.ResultSetToResult(rs, comment) } -// ResultSetToResult converts ast.RecordSet to testkit.Result. +// ResultSetToResult converts sqlexec.RecordSet to testkit.Result. // It is used to check results of execute statement in binary mode. -func (tk *TestKit) ResultSetToResult(rs ast.RecordSet, comment check.CommentInterface) *Result { +func (tk *TestKit) ResultSetToResult(rs sqlexec.RecordSet, comment check.CommentInterface) *Result { rows, err := session.GetRows4Test(context.Background(), tk.Se, rs) tk.c.Assert(errors.ErrorStack(err), check.Equals, "", comment) err = rs.Close() diff --git a/util/timeutil/time.go b/util/timeutil/time.go index e3527238a1a23..5ebdf1212b142 100644 --- a/util/timeutil/time.go +++ b/util/timeutil/time.go @@ -117,9 +117,13 @@ func SystemLocation() *time.Location { return loc } +var setSysTZOnce sync.Once + // SetSystemTZ sets systemTZ by the value loaded from mysql.tidb. func SetSystemTZ(name string) { - systemTZ = name + setSysTZOnce.Do(func() { + systemTZ = name + }) } // getLoc first trying to load location from a cache map. If nothing found in such map, then call diff --git a/vendor/github.com/cznic/golex/LICENSE b/vendor/github.com/cznic/golex/LICENSE deleted file mode 100644 index cbf4063474594..0000000000000 --- a/vendor/github.com/cznic/golex/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014 The golex Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the names of the authors nor the names of the -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/golex/lex/api.go b/vendor/github.com/cznic/golex/lex/api.go deleted file mode 100644 index 3f84390370351..0000000000000 --- a/vendor/github.com/cznic/golex/lex/api.go +++ /dev/null @@ -1,410 +0,0 @@ -// Copyright (c) 2015 The golex Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package lex - -import ( - "bytes" - "fmt" - "go/token" - "io" - "os" -) - -// BOM handling modes which can be set by the BOMMode Option. Default is BOMIgnoreFirst. -const ( - BOMError = iota // BOM is an error anywhere. - BOMIgnoreFirst // Skip BOM if at beginning, report as error if anywhere else. - BOMPassAll // No special handling of BOM. - BOMPassFirst // No special handling of BOM if at beginning, report as error if anywhere else. -) - -const ( - NonASCII = 0x80 // DefaultRuneClass returns NonASCII for non ASCII runes. - RuneEOF = -1 // Distinct from any valid Unicode rune value. -) - -// DefaultRuneClass returns the character class of r. If r is an ASCII code -// then its class equals the ASCII code. Any other rune is of class NonASCII. -// -// DefaultRuneClass is the default implementation Lexer will use to convert -// runes (21 bit entities) to scanner classes (8 bit entities). -// -// Non ASCII aware lexical analyzers will typically use their own -// categorization function. To assign such custom function use the RuneClass -// option. -func DefaultRuneClass(r rune) int { - if r >= 0 && r < 0x80 { - return int(r) - } - - return NonASCII -} - -// Char represents a rune and its position. -type Char struct { - Rune rune - pos int32 -} - -// NewChar returns a new Char value. -func NewChar(pos token.Pos, r rune) Char { return Char{pos: int32(pos), Rune: r} } - -// IsValid reports whether c is not a zero Char. -func (c Char) IsValid() bool { return c.Pos().IsValid() } - -// Pos returns the token.Pos associated with c. -func (c Char) Pos() token.Pos { return token.Pos(c.pos) } - -// CharReader is a RuneReader providing additionally explicit position -// information by returning a Char instead of a rune as its first result. -type CharReader interface { - ReadChar() (c Char, size int, err error) -} - -// Lexer suports golex[0] generated lexical analyzers. -type Lexer struct { - File *token.File // The *token.File passed to New. - First Char // First remembers the lookahead char when Rule0 was invoked. - Last Char // Last remembers the last Char returned by Next. - Prev Char // Prev remembers the Char previous to Last. - bomMode int // See the BOM* constants. - bytesBuf bytes.Buffer // Used by TokenBytes. - charSrc CharReader // Lexer alternative input. - classf func(rune) int // - errorf func(token.Pos, string) // - lookahead Char // Lookahead if non zero. - mark int // Longest match marker. - off int // Used for File.AddLine. - src io.RuneReader // Lexer input. - tokenBuf []Char // Lexeme collector. - ungetBuf []Char // Unget buffer. -} - -// New returns a new *Lexer. The result can be amended using opts. -// -// Non Unicode Input -// -// To consume sources in other encodings and still have exact position -// information, pass an io.RuneReader which returns the next input character -// reencoded as an Unicode rune but returns the size (number of bytes used to -// encode it) of the original character, not the size of its UTF-8 -// representation after converted to an Unicode rune. Size is the second -// returned value of io.RuneReader.ReadRune method[4]. -// -// When src optionally implements CharReader its ReadChar method is used -// instead of io.ReadRune. -func New(file *token.File, src io.RuneReader, opts ...Option) (*Lexer, error) { - r := &Lexer{ - File: file, - bomMode: BOMIgnoreFirst, - classf: DefaultRuneClass, - src: src, - } - if x, ok := src.(CharReader); ok { - r.charSrc = x - } - r.errorf = r.defaultErrorf - for _, o := range opts { - if err := o(r); err != nil { - return nil, err - } - } - return r, nil -} - -// Abort handles the situation when the scanner does not successfully recognize -// any token or when an attempt to find the longest match "overruns" from an -// accepting state only to never reach an accepting state again. In the first -// case the scanner was never in an accepting state since last call to Rule0 -// and then (true, previousLookahead rune) is returned, effectively consuming a -// single Char token, avoiding scanner stall. Otherwise there was at least one -// accepting scanner state marked using Mark. In this case Abort rollbacks the -// lexer state to the marked state and returns (false, 0). The scanner must -// then execute a prescribed goto statement. For example: -// -// %yyc c -// %yyn c = l.Next() -// %yym l.Mark() -// -// %{ -// package foo -// -// import (...) -// -// type lexer struct { -// *lex.Lexer -// ... -// } -// -// func newLexer(...) *lexer { -// return &lexer{ -// lex.NewLexer(...), -// ... -// } -// } -// -// func (l *lexer) scan() int { -// c := l.Enter() -// %} -// -// ... more lex defintions -// -// %% -// -// c = l.Rule0() -// -// ... lex rules -// -// %% -// -// if c, ok := l.Abort(); ok { -// return c -// } -// -// goto yyAction -// } -func (l *Lexer) Abort() (int, bool) { - if l.mark >= 0 { - if len(l.tokenBuf) > l.mark { - l.Unget(l.lookahead) - for i := len(l.tokenBuf) - 1; i >= l.mark; i-- { - l.Unget(l.tokenBuf[i]) - } - } - l.tokenBuf = l.tokenBuf[:l.mark] - return 0, false - } - - switch n := len(l.tokenBuf); n { - case 0: // [] z - c := l.lookahead - l.Next() - return int(c.Rune), true - case 1: // [a] z - return int(l.tokenBuf[0].Rune), true - default: // [a, b, ...], z - c := l.tokenBuf[0] // a - l.Unget(l.lookahead) // z - for i := n - 1; i > 1; i-- { - l.Unget(l.tokenBuf[i]) // ... - } - l.lookahead = l.tokenBuf[1] // b - l.tokenBuf = l.tokenBuf[:1] - return int(c.Rune), true - } -} - -func (l *Lexer) class() int { return l.classf(l.lookahead.Rune) } - -func (l *Lexer) defaultErrorf(pos token.Pos, msg string) { - l.Error(fmt.Sprintf("%v: %v", l.File.Position(pos), msg)) -} - -// Enter ensures the lexer has a valid lookahead Char and returns its class. -// Typical use in an .l file -// -// func (l *lexer) scan() lex.Char { -// c := l.Enter() -// ... -func (l *Lexer) Enter() int { - if !l.lookahead.IsValid() { - l.Next() - } - return l.class() -} - -// Error Implements yyLexer[2] by printing the msg to stderr. -func (l *Lexer) Error(msg string) { - fmt.Fprintf(os.Stderr, "%s\n", msg) -} - -// Lookahead returns the current lookahead. -func (l *Lexer) Lookahead() Char { - if !l.lookahead.IsValid() { - l.Next() - } - return l.lookahead -} - -// Mark records the current state of scanner as accepting. It implements the -// golex macro %yym. Typical usage in an .l file: -// -// %yym l.Mark() -func (l *Lexer) Mark() { l.mark = len(l.tokenBuf) } - -func (l *Lexer) next() int { - const bom = '\ufeff' - - if c := l.lookahead; c.IsValid() { - l.tokenBuf = append(l.tokenBuf, c) - } - if n := len(l.ungetBuf); n != 0 { - l.lookahead = l.ungetBuf[n-1] - l.ungetBuf = l.ungetBuf[:n-1] - return l.class() - } - - if l.src == nil { - return RuneEOF - } - - var r rune - var sz int - var err error - var pos token.Pos - var c Char -again: - off0 := l.off - switch cs := l.charSrc; { - case cs != nil: - c, sz, err = cs.ReadChar() - r = c.Rune - pos = c.Pos() - default: - r, sz, err = l.src.ReadRune() - pos = l.File.Pos(l.off) - } - l.off += sz - if err != nil { - l.src = nil - r = RuneEOF - if err != io.EOF { - l.errorf(pos, err.Error()) - } - } - - if r == bom { - switch l.bomMode { - default: - fallthrough - case BOMIgnoreFirst: - if off0 != 0 { - l.errorf(pos, "unicode (UTF-8) BOM in middle of file") - } - goto again - case BOMPassAll: - // nop - case BOMPassFirst: - if off0 != 0 { - l.errorf(pos, "unicode (UTF-8) BOM in middle of file") - goto again - } - case BOMError: - switch { - case off0 == 0: - l.errorf(pos, "unicode (UTF-8) BOM at beginnig of file") - default: - l.errorf(pos, "unicode (UTF-8) BOM in middle of file") - } - goto again - } - } - - l.lookahead = NewChar(pos, r) - if r == '\n' { - l.File.AddLine(l.off) - } - return l.class() -} - -// Next advances the scanner for one rune and returns the respective character -// class of the new lookahead. Typical usage in an .l file: -// -// %yyn c = l.Next() -func (l *Lexer) Next() int { - l.Prev = l.Last - r := l.next() - l.Last = l.lookahead - return r -} - -// Offset returns the current reading offset of the lexer's source. -func (l *Lexer) Offset() int { return l.off } - -// Rule0 initializes the scanner state before the attempt to recognize a token -// starts. The token collecting buffer is cleared. Rule0 records the current -// lookahead in l.First and returns its class. Typical usage in an .l file: -// -// ... lex definitions -// -// %% -// -// c := l.Rule0() -// -// first-pattern-regexp -func (l *Lexer) Rule0() int { - if !l.lookahead.IsValid() { - l.Next() - } - l.First = l.lookahead - l.mark = -1 - if len(l.tokenBuf) > 1<<18 { //DONE constant tuned - l.tokenBuf = nil - } else { - l.tokenBuf = l.tokenBuf[:0] - } - return l.class() -} - -// Token returns the currently collected token chars. The result is R/O. -func (l *Lexer) Token() []Char { return l.tokenBuf } - -// TokenBytes returns the UTF-8 encoding of Token. If builder is not nil then -// it's called instead to build the encoded token byte value into the buffer -// passed to it. -// -// The Result is R/O. -func (l *Lexer) TokenBytes(builder func(*bytes.Buffer)) []byte { - if len(l.bytesBuf.Bytes()) < 1<<18 { //DONE constant tuned - l.bytesBuf.Reset() - } else { - l.bytesBuf = bytes.Buffer{} - } - switch { - case builder != nil: - builder(&l.bytesBuf) - default: - for _, c := range l.Token() { - l.bytesBuf.WriteRune(c.Rune) - } - } - return l.bytesBuf.Bytes() -} - -// Unget unreads all chars in c. -func (l *Lexer) Unget(c ...Char) { - l.ungetBuf = append(l.ungetBuf, c...) - l.lookahead = Char{} // Must invalidate lookahead. -} - -// Option is a function which can be passed as an optional argument to New. -type Option func(*Lexer) error - -// BOMMode option selects how the lexer handles BOMs. See the BOM* constants for details. -func BOMMode(mode int) Option { - return func(l *Lexer) error { - l.bomMode = mode - return nil - } -} - -// ErrorFunc option sets a function called when an, for example I/O error, -// occurs. The default is to call Error with the position and message already -// formated as a string. -func ErrorFunc(f func(token.Pos, string)) Option { - return func(l *Lexer) error { - l.errorf = f - return nil - } -} - -// RuneClass option sets the function used to convert runes to character -// classes. -func RuneClass(f func(rune) int) Option { - return func(l *Lexer) error { - l.classf = f - return nil - } -} diff --git a/vendor/github.com/cznic/golex/lex/doc.go b/vendor/github.com/cznic/golex/lex/doc.go deleted file mode 100644 index 10b0b43073177..0000000000000 --- a/vendor/github.com/cznic/golex/lex/doc.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2015 The golex Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package lex is a Unicode-friendly run time library for golex[0] generated -// lexical analyzers[1]. -// -// Changelog -// -// 2015-04-08: Initial release. -// -// Character classes -// -// Golex internally handles only 8 bit "characters". Many Unicode-aware -// tokenizers do not actually need to recognize every Unicode rune, but only -// some particular partitions/subsets. Like, for example, a particular Unicode -// category, say upper case letters: Lu. -// -// The idea is to convert all runes in a particular set as a single 8 bit -// character allocated outside the ASCII range of codes. The token value, a -// string of runes and their exact positions is collected as usual (see the -// Token and TokenBytes method), but the tokenizer DFA is simpler (and thus -// smaller and perhaps also faster) when this technique is used. In the example -// program (see below), recognizing (and skipping) white space, integer -// literals, one keyword and Go identifiers requires only an 8 state DFA[5]. -// -// To provide the conversion from runes to character classes, "install" your -// converting function using the RuneClass option. -// -// References -// -// - -// -// [0]: http://godoc.org/github.com/cznic/golex -// [1]: http://en.wikipedia.org/wiki/Lexical_analysis -// [2]: http://golang.org/cmd/yacc/ -// [3]: https://github.com/cznic/golex/blob/master/lex/example.l -// [4]: http://golang.org/pkg/io/#RuneReader -// [5]: https://github.com/cznic/golex/blob/master/lex/dfa -package lex diff --git a/vendor/github.com/cznic/parser/nquads/LICENSE b/vendor/github.com/cznic/parser/nquads/LICENSE deleted file mode 100644 index f007b7fa8ff3a..0000000000000 --- a/vendor/github.com/cznic/parser/nquads/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014 The parser Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the names of the authors nor the names of the -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/parser/yacc/LICENSE b/vendor/github.com/cznic/parser/yacc/LICENSE deleted file mode 100644 index f007b7fa8ff3a..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014 The parser Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the names of the authors nor the names of the -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/parser/yacc/api.go b/vendor/github.com/cznic/parser/yacc/api.go deleted file mode 100644 index 798cf477e4958..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/api.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2015 The parser Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run generate.go -//go:generate golex -o goscanner.go go.l -//go:generate golex -o scanner.go y.l -//go:generate go run generate.go -2 - -// Package parser implements a parser for yacc source files. -// -// Note: Rule.Body element's type -// -// int Eg. 65 represents literal 'A' -// -// string Eg. "Start" represents rule component Start -// -// *Action Mid rule action or rule semantic action -package parser - -import ( - "bytes" - "fmt" - "go/token" - - "github.com/cznic/golex/lex" -) - -const ( - // ActionValueGo is used for a Go code fragment - ActionValueGo = iota - // ActionValueDlrDlr is used for $$. - ActionValueDlrDlr - // ActionValueDlrTagDlr is used for $$. - ActionValueDlrTagDlr - // ActionValueDlrNum is used for $num. - ActionValueDlrNum - // ActionValueDlrTagNum is used for $num. - ActionValueDlrTagNum -) - -// ActionValue is an item of Action.Value -type ActionValue struct { - Num int // The number in $num. - Pos token.Pos // Position of the start of the ActionValue. - Src string // Source for this value. - Tag string // The tag in $$ or $num. - Type int // One of ActionValue{Go,DlrDlr,DlrTagDlr,DlrNum,DlrTagNum} constants. -} - -// Token captures a lexem with position, value and comments, if any. -type Token struct { - Comments []string - Val string - File *token.File - lex.Char -} - -// Pos retruns the token.Pos for t. -func (t *Token) Pos() token.Pos { return t.Char.Pos() } - -// Position returns the token.Position for t -func (t *Token) Position() token.Position { return t.File.Position(t.Pos()) } - -// Strings implements fmt.Stringer. -func (t *Token) String() string { - return fmt.Sprintf("%v: %v %q, Comments: %q", t.File.Position(t.Char.Pos()), yySymName(int(t.Char.Rune)), t.Val, t.Comments) -} - -// Parse parses src as a single yacc source file fname and returns the -// corresponding Specification. If the source couldn't be read, the returned -// Specification is nil and the error indicates all of the specific failures. -func Parse(fset *token.FileSet, fname string, src []byte) (s *Specification, err error) { - r := bytes.NewBuffer(src) - file := fset.AddFile(fname, -1, len(src)) - lx, err := newLexer(file, r) - if err != nil { - return nil, err - } - - y := yyParse(lx) - n := len(lx.errors) - if y != 0 || n != 0 { - if n == 0 { - panic("internal error") - } - - return nil, lx.errors - } - - return lx.spec, nil -} diff --git a/vendor/github.com/cznic/parser/yacc/ast.go b/vendor/github.com/cznic/parser/yacc/ast.go deleted file mode 100644 index dac601f204b28..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/ast.go +++ /dev/null @@ -1,514 +0,0 @@ -// CAUTION: Generated by yy - DO NOT EDIT. - -// Copyright 2015 The parser 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 is a derived work base on the original at -// -// http://pubs.opengroup.org/onlinepubs/009695399/utilities/yacc.html -// -// The original work is -// -// Copyright © 2001-2004 The IEEE and The Open Group, All Rights reserved. -// -// Grammar for the input to yacc. - -package parser - -import ( - "go/token" -) - -// Action represents data reduced by production: -// -// Action: -// '{' '}' -type Action struct { - Values []*ActionValue // For backward compatibility. - Token *Token - Token2 *Token -} - -func (n *Action) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Action) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Action) Pos() token.Pos { - return n.Token.Pos() -} - -// Definition represents data reduced by productions: -// -// Definition: -// START IDENTIFIER -// | UNION // Case 1 -// | LCURL RCURL // Case 2 -// | ReservedWord Tag NameList // Case 3 -// | ReservedWord Tag // Case 4 -// | ERROR_VERBOSE // Case 5 -type Definition struct { - Nlist []*Name // For backward compatibility. - Value string - Case int - NameList *NameList - ReservedWord *ReservedWord - Tag *Tag - Token *Token - Token2 *Token -} - -func (n *Definition) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Definition) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Definition) Pos() token.Pos { - switch n.Case { - case 3, 4: - return n.ReservedWord.Pos() - case 0, 1, 2, 5: - return n.Token.Pos() - default: - panic("internal error") - } -} - -// DefinitionList represents data reduced by productions: -// -// DefinitionList: -// /* empty */ -// | DefinitionList Definition // Case 1 -type DefinitionList struct { - Definition *Definition - DefinitionList *DefinitionList -} - -func (n *DefinitionList) reverse() *DefinitionList { - if n == nil { - return nil - } - - na := n - nb := na.DefinitionList - for nb != nil { - nc := nb.DefinitionList - nb.DefinitionList = na - na = nb - nb = nc - } - n.DefinitionList = nil - return na -} - -func (n *DefinitionList) fragment() interface{} { return n.reverse() } - -// String implements fmt.Stringer. -func (n *DefinitionList) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *DefinitionList) Pos() token.Pos { - if n == nil { - return 0 - } - - if p := n.DefinitionList.Pos(); p != 0 { - return p - } - - return n.Definition.Pos() -} - -// LiteralStringOpt represents data reduced by productions: -// -// LiteralStringOpt: -// /* empty */ -// | STRING_LITERAL // Case 1 -type LiteralStringOpt struct { - Token *Token -} - -func (n *LiteralStringOpt) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *LiteralStringOpt) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *LiteralStringOpt) Pos() token.Pos { - if n == nil { - return 0 - } - - return n.Token.Pos() -} - -// Name represents data reduced by productions: -// -// Name: -// IDENTIFIER LiteralStringOpt -// | IDENTIFIER NUMBER LiteralStringOpt // Case 1 -type Name struct { - Identifier interface{} // For backward compatibility. - Number int // For backward compatibility. - Case int - LiteralStringOpt *LiteralStringOpt - Token *Token - Token2 *Token -} - -func (n *Name) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Name) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Name) Pos() token.Pos { - return n.Token.Pos() -} - -// NameList represents data reduced by productions: -// -// NameList: -// Name -// | NameList Name // Case 1 -// | NameList ',' Name // Case 2 -type NameList struct { - Case int - Name *Name - NameList *NameList - Token *Token -} - -func (n *NameList) reverse() *NameList { - if n == nil { - return nil - } - - na := n - nb := na.NameList - for nb != nil { - nc := nb.NameList - nb.NameList = na - na = nb - nb = nc - } - n.NameList = nil - return na -} - -func (n *NameList) fragment() interface{} { return n.reverse() } - -// String implements fmt.Stringer. -func (n *NameList) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *NameList) Pos() token.Pos { - switch n.Case { - case 0: - return n.Name.Pos() - case 1, 2: - return n.NameList.Pos() - default: - panic("internal error") - } -} - -// Precedence represents data reduced by productions: -// -// Precedence: -// /* empty */ -// | PREC IDENTIFIER // Case 1 -// | PREC IDENTIFIER Action // Case 2 -// | Precedence ';' // Case 3 -type Precedence struct { - Identifier interface{} // Name string or literal int. - Action *Action - Case int - Precedence *Precedence - Token *Token - Token2 *Token -} - -func (n *Precedence) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Precedence) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Precedence) Pos() token.Pos { - switch n.Case { - case 0: - return 0 - case 3: - if p := n.Precedence.Pos(); p != 0 { - return p - } - - return n.Token.Pos() - case 1, 2: - return n.Token.Pos() - default: - panic("internal error") - } -} - -// ReservedWord represents data reduced by productions: -// -// ReservedWord: -// TOKEN -// | LEFT // Case 1 -// | RIGHT // Case 2 -// | NONASSOC // Case 3 -// | TYPE // Case 4 -// | PRECEDENCE // Case 5 -type ReservedWord struct { - Case int - Token *Token -} - -func (n *ReservedWord) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *ReservedWord) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *ReservedWord) Pos() token.Pos { - return n.Token.Pos() -} - -// Rule represents data reduced by productions: -// -// Rule: -// C_IDENTIFIER RuleItemList Precedence -// | '|' RuleItemList Precedence // Case 1 -type Rule struct { - Body []interface{} // For backward compatibility. - Name *Token - Case int - Precedence *Precedence - RuleItemList *RuleItemList - Token *Token -} - -func (n *Rule) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Rule) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Rule) Pos() token.Pos { - return n.Token.Pos() -} - -// RuleItemList represents data reduced by productions: -// -// RuleItemList: -// /* empty */ -// | RuleItemList IDENTIFIER // Case 1 -// | RuleItemList Action // Case 2 -// | RuleItemList STRING_LITERAL // Case 3 -type RuleItemList struct { - Action *Action - Case int - RuleItemList *RuleItemList - Token *Token -} - -func (n *RuleItemList) reverse() *RuleItemList { - if n == nil { - return nil - } - - na := n - nb := na.RuleItemList - for nb != nil { - nc := nb.RuleItemList - nb.RuleItemList = na - na = nb - nb = nc - } - n.RuleItemList = nil - return na -} - -func (n *RuleItemList) fragment() interface{} { return n.reverse() } - -// String implements fmt.Stringer. -func (n *RuleItemList) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *RuleItemList) Pos() token.Pos { - switch n.Case { - case 0: - return 0 - case 2: - if p := n.RuleItemList.Pos(); p != 0 { - return p - } - - return n.Action.Pos() - case 1, 3: - if p := n.RuleItemList.Pos(); p != 0 { - return p - } - - return n.Token.Pos() - default: - panic("internal error") - } -} - -// RuleList represents data reduced by productions: -// -// RuleList: -// C_IDENTIFIER RuleItemList Precedence -// | RuleList Rule // Case 1 -type RuleList struct { - Case int - Precedence *Precedence - Rule *Rule - RuleItemList *RuleItemList - RuleList *RuleList - Token *Token -} - -func (n *RuleList) reverse() *RuleList { - if n == nil { - return nil - } - - na := n - nb := na.RuleList - for nb != nil { - nc := nb.RuleList - nb.RuleList = na - na = nb - nb = nc - } - n.RuleList = nil - return na -} - -func (n *RuleList) fragment() interface{} { return n.reverse() } - -// String implements fmt.Stringer. -func (n *RuleList) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *RuleList) Pos() token.Pos { - switch n.Case { - case 1: - return n.RuleList.Pos() - case 0: - return n.Token.Pos() - default: - panic("internal error") - } -} - -// Specification represents data reduced by production: -// -// Specification: -// DefinitionList "%%" RuleList Tail -type Specification struct { - Defs []*Definition // For backward compatibility. - Rules []*Rule // For backward compatibility. - DefinitionList *DefinitionList - RuleList *RuleList - Tail *Tail - Token *Token -} - -func (n *Specification) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Specification) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Specification) Pos() token.Pos { - if p := n.DefinitionList.Pos(); p != 0 { - return p - } - - return n.Token.Pos() -} - -// Tag represents data reduced by productions: -// -// Tag: -// /* empty */ -// | '<' IDENTIFIER '>' // Case 1 -type Tag struct { - Token *Token - Token2 *Token - Token3 *Token -} - -func (n *Tag) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Tag) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Tag) Pos() token.Pos { - if n == nil { - return 0 - } - - return n.Token.Pos() -} - -// Tail represents data reduced by productions: -// -// Tail: -// "%%" -// | /* empty */ // Case 1 -type Tail struct { - Value string - Token *Token -} - -func (n *Tail) fragment() interface{} { return n } - -// String implements fmt.Stringer. -func (n *Tail) String() string { - return prettyString(n) -} - -// Pos reports the position of the first component of n or zero if it's empty. -func (n *Tail) Pos() token.Pos { - if n == nil { - return 0 - } - - return n.Token.Pos() -} diff --git a/vendor/github.com/cznic/parser/yacc/generate.go b/vendor/github.com/cznic/parser/yacc/generate.go deleted file mode 100644 index 834c25a090b00..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/generate.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2015 The parser Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "flag" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" -) - -func yy() (nm string, err error) { - y, err := os.Create("parser.y") - if err != nil { - return "", err - } - - nm = y.Name() - cmd := exec.Command( - "yy", - "-astImport", "\"go/token\"", - "-kind", "Case", - "-o", nm, - "parser.yy", - ) - if out, err := cmd.CombinedOutput(); err != nil { - os.Remove(nm) - log.Printf("%s", out) - return "", err - } - - return nm, nil -} - -func goyacc(y string) (err error) { - t, err := ioutil.TempFile("", "go-generate-xegen-") - if err != nil { - log.Fatal(err) - } - - defer func() { - if e := os.Remove(t.Name()); e != nil && err == nil { - err = e - } - }() - - cmd := exec.Command("goyacc", "-o", os.DevNull, "-xegen", t.Name(), y) - if out, err := cmd.CombinedOutput(); err != nil { - log.Printf("%s\n", out) - return err - } - - xerrors, err := ioutil.ReadFile("xerrors") - if err != nil { - return err - } - - if _, err := t.Seek(0, 2); err != nil { - return err - } - - if _, err := t.Write(xerrors); err != nil { - return err - } - - cmd = exec.Command("goyacc", "-cr", "-xe", t.Name(), "-o", "parser.go", "-dlvalf", "%v", "-dlval", "prettyString(lval.Token)", y) - if out, err := cmd.CombinedOutput(); err != nil { - log.Printf("%s", out) - return err - } else { - log.Printf("%s", out) - } - - return nil -} - -func main() { - if err := main0(); err != nil { - log.Fatal(err) - } -} - -func main0() (err error) { - log.SetFlags(log.Lshortfile) - p2 := flag.Bool("2", false, "") - flag.Parse() - if *p2 { - return main2() - } - - os.Remove("ast.go") - os.Remove("ast_test.go") - y, err := yy() - if err != nil { - return err - } - - return goyacc(y) -} - -func main2() (err error) { - goCmd := exec.Command("go", "test", "-run", "^Example") - out, err := goCmd.CombinedOutput() // Errors are expected and wanted here. - feCmd := exec.Command("fe") - feCmd.Stdin = bytes.NewBuffer(out) - if out, err = feCmd.CombinedOutput(); err != nil { - log.Printf("%s", out) - return err - } - - matches, err := filepath.Glob("*_test.go") - if err != nil { - return err - } - - cmd := exec.Command("pcregrep", append([]string{"-nM", `failed|panic|\/\/ |// false|// -1|Output:\n}`}, matches...)...) - if out, _ = cmd.CombinedOutput(); len(out) != 0 { // Error != nil when no matches - log.Printf("%s", out) - } - return nil -} diff --git a/vendor/github.com/cznic/parser/yacc/goscanner.go b/vendor/github.com/cznic/parser/yacc/goscanner.go deleted file mode 100644 index 71d385ab8083d..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/goscanner.go +++ /dev/null @@ -1,436 +0,0 @@ -// CAUTION: Generated file - DO NOT EDIT. - -// Copyright 2015 The parser Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// CAUTION: Generated file (unless this is go.l) - DO NOT EDIT! - -package parser - -import ( - "fmt" - - "github.com/cznic/golex/lex" -) - -func (l *lexer) scanGo() lex.Char { - c := l.Enter() - -yystate0: - yyrule := -1 - _ = yyrule - - switch yyt := l.state; yyt { - default: - panic(fmt.Errorf(`invalid start condition %d`, yyt)) - case 0: // start condition: INITIAL - goto yystart1 - case 1: // start condition: DLR - goto yystart20 - } - - goto yystate0 // silence unused label error - goto yyAction // silence unused label error -yyAction: - switch yyrule { - case 1: - goto yyrule1 - case 2: - goto yyrule2 - case 3: - goto yyrule3 - case 4: - goto yyrule4 - case 5: - goto yyrule5 - case 6: - goto yyrule6 - case 7: - goto yyrule7 - case 8: - goto yyrule8 - case 9: - goto yyrule9 - case 10: - goto yyrule10 - case 11: - goto yyrule11 - case 12: - goto yyrule12 - case 13: - goto yyrule13 - case 14: - goto yyrule14 - } - goto yystate1 // silence unused label error -yystate1: - c = l.Next() -yystart1: - switch { - default: - goto yyabort - case c == '!' || c == '#' || c == '%' || c == '&' || c >= '(' && c <= '+' || c == '-' || c == '.' || c >= ':' && c <= '@' || c == '[' || c == '_' || c == '|' || c == '~': - goto yystate3 - case c == '"': - goto yystate4 - case c == '$': - goto yystate7 - case c == '/': - goto yystate11 - case c == '\'': - goto yystate8 - case c == '\t' || c == '\n' || c == '\r' || c == ' ': - goto yystate2 - case c == '\u0081': - goto yystate19 - case c == '{': - goto yystate17 - case c == '}': - goto yystate18 - case c >= '0' && c <= '9': - goto yystate16 - } - -yystate2: - c = l.Next() - yyrule = 8 - l.Mark() - switch { - default: - goto yyrule8 - case c == '\t' || c == '\n' || c == '\r' || c == ' ': - goto yystate2 - } - -yystate3: - c = l.Next() - yyrule = 5 - l.Mark() - goto yyrule5 - -yystate4: - c = l.Next() - switch { - default: - goto yyabort - case c == '"': - goto yystate5 - case c == '\\': - goto yystate6 - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate4 - } - -yystate5: - c = l.Next() - yyrule = 7 - l.Mark() - goto yyrule7 - -yystate6: - c = l.Next() - switch { - default: - goto yyabort - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate4 - } - -yystate7: - c = l.Next() - yyrule = 3 - l.Mark() - goto yyrule3 - -yystate8: - c = l.Next() - switch { - default: - goto yyabort - case c == '\'': - goto yystate9 - case c == '\\': - goto yystate10 - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '&' || c >= '(' && c <= '[' || c >= ']' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate8 - } - -yystate9: - c = l.Next() - yyrule = 6 - l.Mark() - goto yyrule6 - -yystate10: - c = l.Next() - switch { - default: - goto yyabort - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate8 - } - -yystate11: - c = l.Next() - switch { - default: - goto yyabort - case c == '*': - goto yystate12 - case c == '/': - goto yystate15 - case c >= '\x01' && c <= ')' || c >= '+' && c <= '.' || c >= '0' && c <= 'ÿ': - goto yystate3 - } - -yystate12: - c = l.Next() - switch { - default: - goto yyabort - case c == '*': - goto yystate13 - case c >= '\x01' && c <= ')' || c >= '+' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate12 - } - -yystate13: - c = l.Next() - switch { - default: - goto yyabort - case c == '*': - goto yystate13 - case c == '/': - goto yystate14 - case c >= '\x01' && c <= ')' || c >= '+' && c <= '.' || c >= '0' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate12 - } - -yystate14: - c = l.Next() - yyrule = 9 - l.Mark() - goto yyrule9 - -yystate15: - c = l.Next() - yyrule = 9 - l.Mark() - switch { - default: - goto yyrule9 - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate15 - } - -yystate16: - c = l.Next() - yyrule = 4 - l.Mark() - switch { - default: - goto yyrule4 - case c >= '0' && c <= '9': - goto yystate16 - } - -yystate17: - c = l.Next() - yyrule = 1 - l.Mark() - goto yyrule1 - -yystate18: - c = l.Next() - yyrule = 2 - l.Mark() - goto yyrule2 - -yystate19: - c = l.Next() - yyrule = 10 - l.Mark() - switch { - default: - goto yyrule10 - case c == '\u0081': - goto yystate19 - } - - goto yystate20 // silence unused label error -yystate20: - c = l.Next() -yystart20: - switch { - default: - goto yyabort - case c == '!' || c == '#' || c == '%' || c == '&' || c >= '(' && c <= '+' || c == '-' || c == '.' || c >= ':' && c <= '@' || c == '[' || c == '_' || c == '|' || c == '~': - goto yystate3 - case c == '"': - goto yystate4 - case c == '$': - goto yystate21 - case c == '/': - goto yystate11 - case c == '\'': - goto yystate8 - case c == '\t' || c == '\n' || c == '\r' || c == ' ': - goto yystate2 - case c == '\u0081': - goto yystate19 - case c == '{': - goto yystate17 - case c == '}': - goto yystate18 - case c >= '0' && c <= '9': - goto yystate16 - } - -yystate21: - c = l.Next() - switch { - default: - goto yyabort - case c == '$': - goto yystate22 - case c == '-': - goto yystate23 - case c == '<': - goto yystate25 - case c >= '0' && c <= '9': - goto yystate24 - } - -yystate22: - c = l.Next() - yyrule = 11 - l.Mark() - goto yyrule11 - -yystate23: - c = l.Next() - switch { - default: - goto yyabort - case c >= '0' && c <= '9': - goto yystate24 - } - -yystate24: - c = l.Next() - yyrule = 13 - l.Mark() - switch { - default: - goto yyrule13 - case c >= '0' && c <= '9': - goto yystate24 - } - -yystate25: - c = l.Next() - switch { - default: - goto yyabort - case c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate26 - } - -yystate26: - c = l.Next() - switch { - default: - goto yyabort - case c == '>': - goto yystate27 - case c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate26 - } - -yystate27: - c = l.Next() - switch { - default: - goto yyabort - case c == '$': - goto yystate28 - case c == '-': - goto yystate29 - case c >= '0' && c <= '9': - goto yystate30 - } - -yystate28: - c = l.Next() - yyrule = 12 - l.Mark() - goto yyrule12 - -yystate29: - c = l.Next() - switch { - default: - goto yyabort - case c >= '0' && c <= '9': - goto yystate30 - } - -yystate30: - c = l.Next() - yyrule = 14 - l.Mark() - switch { - default: - goto yyrule14 - case c >= '0' && c <= '9': - goto yystate30 - } - -yyrule1: // "{" - { - return l.char('{') - } -yyrule2: // "}" - { - return l.char('}') - } -yyrule3: // "$" -yyrule4: // {intlit} -yyrule5: // {punct} -yyrule6: // {runelit} -yyrule7: // {strlit} -yyrule8: // {white} -yyrule9: // {comment} -yyrule10: // {other}+ - { - return l.char(' ') - } -yyrule11: // "$$" - { - return l.char(' ') - } -yyrule12: // "$"<{tag}>"$" - { - return l.char(' ') - } -yyrule13: // "$"{n} - { - return l.char(' ') - } -yyrule14: // "$"<{tag}>{n} - { - return l.char(' ') - } - panic("unreachable") - - goto yyabort // silence unused label error - -yyabort: // no lexem recognized - if c, ok := l.Abort(); ok { - return l.char(c) - } - - goto yyAction -} diff --git a/vendor/github.com/cznic/parser/yacc/lexer.go b/vendor/github.com/cznic/parser/yacc/lexer.go deleted file mode 100644 index 357ff62ff9696..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/lexer.go +++ /dev/null @@ -1,656 +0,0 @@ -// Copyright 2015 The parser Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package parser - -import ( - "bytes" - "fmt" - "go/scanner" - "go/token" - "io" - "reflect" - "sort" - "strconv" - "strings" - - "github.com/cznic/golex/lex" - "github.com/cznic/strutil" -) - -// Node represents an AST node. -type Node interface { - Pos() token.Pos -} - -const ( - ccEOF = iota + 0x80 - ccOther -) - -type lexer struct { - *lex.Lexer - comments []string - defs []*Definition - errors scanner.ErrorList - example interface{} - exampleRule int - hold *Token - lastCommentLast lex.Char - lastTok *Token - marks int - pos token.Pos - pos2 token.Pos - positions []token.Pos - positions2 []token.Pos - ruleName *Token - rules []*Rule - spec *Specification - state int - value string - value2 string - values []string - values2 []string -} - -func newLexer(file *token.File, src io.RuneReader) (_ *lexer, err error) { - l := &lexer{} - if l.Lexer, err = lex.New( - file, - src, - lex.ErrorFunc(func(pos token.Pos, msg string) { - l.errors.Add(l.File.Position(pos), msg) - }), - lex.RuneClass(runeClass), - ); err != nil { - return nil, err - } - - return l, nil -} - -func (l *lexer) scan0() lex.Char { -again: - switch c := l.scan(); c.Rune { - case COMMENT: - val := string(l.TokenBytes(nil)) - lastCommentLastLine := -1 - if p := l.lastCommentLast.Pos(); p.IsValid() { - lastCommentLastLine = l.File.Position(p).Line - } - firstLine := l.File.Position(l.First.Pos()).Line - switch { - case firstLine-lastCommentLastLine <= 1: // Adjacent - l.comments = append(l.comments, val) - default: // New comment block - l.comments = []string{val} - } - l.lastCommentLast = l.Prev - goto again - default: - lastCommentLastLine := -1 - if p := l.lastCommentLast.Pos(); p.IsValid() { - lastCommentLastLine = l.File.Position(p).Line - } - firstLine := l.File.Position(l.First.Pos()).Line - if firstLine-lastCommentLastLine > 1 { // Non adjacent comment(s) - l.comments = nil - } - return c - } -} - -func (l *lexer) lex() *Token { - var c lex.Char - var t *Token - if t = l.hold; t != nil { - l.hold = nil - c = t.Char - } else { - - c = l.scan0() - t = &Token{File: l.File, Char: c, Val: string(l.TokenBytes(l.tokenBuilder)), Comments: l.comments} - } - l.comments = nil - if r := c.Rune; r != IDENTIFIER { - return t - } - - c2 := l.scan0() - if c2.Rune == ':' { - t.Char.Rune = C_IDENTIFIER - return t - } - - l.hold = &Token{File: l.File, Char: c2, Val: string(l.TokenBytes(l.tokenBuilder)), Comments: l.comments} - l.comments = nil - return t -} - -// yyLexer -func (l *lexer) Lex(lval *yySymType) int { - t := l.lex() - switch t.Char.Rune { - case MARK: - l.marks++ - if l.marks == 2 { - l.Rule0() - for l.Next() != lex.RuneEOF { - } - v := l.TokenBytes(nil) - l.value = string(v[:len(v)-1]) - } - case UNION: - l.state = 0 - l.pos = l.Lookahead().Pos() - var val []byte - loop: - for balance := -1; balance != 0; { - l.Rule0() - c := l.scanGo() - r := c.Rune - if r != lex.RuneEOF { - val = append(val, l.TokenBytes(nil)...) - } - switch r := c.Rune; r { - case lex.RuneEOF: - break loop - case '{': - if balance < 0 { - balance = 1 - break - } - - balance++ - case '}': - balance-- - } - } - l.value = string(val) - case LCURL: - l.state = 0 - l.pos = l.Lookahead().Pos() - var val []byte - var prev lex.Char - loop2: - for { - l.Rule0() - c := l.scanGo() - r := c.Rune - if r != lex.RuneEOF { - val = append(val, l.TokenBytes(nil)...) - } - switch r := c.Rune; r { - case lex.RuneEOF: - break loop2 - case '}': - if prev.Rune == '%' { - l.Unget(c, prev) - break loop2 - } - } - prev = l.Prev - } - l.value = string(val[:len(val)-2]) - case '{': - l.state = 1 - l.pos = l.Prev.Pos() - l.values = []string{string(l.TokenBytes(nil))} - l.positions = []token.Pos{l.First.Pos()} - balance := 1 - loop3: - for { - l.Rule0() - c := l.scanGo() - r := c.Rune - part := string(l.TokenBytes(nil)) - if r != lex.RuneEOF { - switch { - case strings.HasPrefix(part, "$"): - l.values = append(l.values, part) - l.positions = append(l.positions, l.First.Pos()) - default: - n := len(l.values) - 1 - s := l.values[n] - if strings.HasPrefix(s, "$") { - l.values = append(l.values, part) - l.positions = append(l.positions, l.First.Pos()) - break - } - - l.values[n] = s + part - } - } - switch r { - case lex.RuneEOF: - break loop3 - case '{': - balance++ - case '}': - balance-- - if balance == 0 { - l.Unget(l.Lookahead(), c) - break loop3 - } - } - } - } - lval.Token = t - l.lastTok = t - return int(t.Rune) -} - -// yyLexer -func (l *lexer) Error(msg string) { - l.err(l.lastTok.Char.Pos(), "%v", msg) -} - -// yyLexerEx -func (l *lexer) Reduced(rule, state int, lval *yySymType) (stop bool) { - if n := l.exampleRule; n >= 0 && rule != n { - return false - } - - switch x := lval.node.(type) { - case interface { - fragment() interface{} - }: - l.example = x.fragment() - default: - l.example = x - } - return true -} - -func (l *lexer) err(pos token.Pos, msg string, arg ...interface{}) { - l.errors.Add(l.File.Position(pos), fmt.Sprintf(msg, arg...)) -} - -func (l *lexer) char(r int) lex.Char { - return lex.NewChar(l.First.Pos(), rune(r)) -} - -func (l *lexer) errChar(c lex.Char, msg string, arg ...interface{}) { - l.err(c.Pos(), msg, arg...) -} - -func (l *lexer) byteValue(dst *bytes.Buffer, in []lex.Char, report rune) int { - switch r := in[1].Rune; { - case r == '\'': - if r == report { - l.errChar(in[1], "unknown escape sequence: '") - } - dst.WriteString(strconv.QuoteRune('\'')) - return 2 - case r == '"': - if r == report { - l.errChar(in[1], "unknown escape sequence: \"") - } - dst.WriteString(strconv.QuoteRune('"')) - return 2 - case r == '\\': - dst.WriteString(strconv.QuoteRune('\\')) - return 2 - case r == 'a': - dst.WriteString(strconv.QuoteRune('\a')) - return 2 - case r == 'b': - dst.WriteString(strconv.QuoteRune('\b')) - return 2 - case r == 'f': - dst.WriteString(strconv.QuoteRune('\f')) - return 2 - case r == 'n': - dst.WriteString(strconv.QuoteRune('\n')) - return 2 - case r == 'r': - dst.WriteString(strconv.QuoteRune('\r')) - return 2 - case r == 't': - dst.WriteString(strconv.QuoteRune('\t')) - return 2 - case r == 'v': - dst.WriteString(strconv.QuoteRune('\v')) - return 2 - case r >= '0' && r <= '7': - val := r - '0' - n := 2 - for _, v := range in[2:] { - r = v.Rune - if r < '0' || r > '7' { - l.errChar(v, "non-octal character in escape sequence: %c", r) - return n - } - val = val<<3 + r - '0' - - n++ - if n == 4 { - dst.WriteString(strconv.QuoteRune(rune(byte(val)))) - return n - } - } - case r == 'x': - val := 0 - n := 2 - for _, v := range in[2:] { - r = v.Rune - if !isHex(r) { - l.errChar(v, "non-hex character in escape sequence: %c", r) - return n - } - val = val<<4 + hexNibble(r) - - n++ - if n == 4 { - dst.WriteString(strconv.QuoteRune(rune(byte(val)))) - return n - } - } - case r == 'u': - r := rune(hexNibble(in[2].Rune)<<12 | - hexNibble(in[3].Rune)<<8 | - hexNibble(in[4].Rune)<<4 | - hexNibble(in[5].Rune)) - if !isValidRune(r) { - l.errChar(l.First, "escape sequence is invalid Unicode code point") - } - dst.WriteString(strconv.QuoteRune(r)) - return 6 - case r == 'U': - r := rune(hexNibble(in[2].Rune)<<28 | - hexNibble(in[3].Rune)<<24 | - hexNibble(in[4].Rune)<<20 | - hexNibble(in[5].Rune)<<16 | - hexNibble(in[6].Rune)<<12 | - hexNibble(in[7].Rune)<<8 | - hexNibble(in[8].Rune)<<4 | - hexNibble(in[9].Rune)) - if !isValidRune(r) { - l.errChar(l.First, "escape sequence is invalid Unicode code point") - } - dst.WriteString(strconv.QuoteRune(r)) - return 10 - } - panic("internal error") -} - -func (l *lexer) parseActionValue(pos token.Pos, src string) *ActionValue { - src0 := src - if !strings.HasPrefix(src, "$") { - return &ActionValue{Type: ActionValueGo, Src: src0, Pos: pos} - } - - if src == "$$" { - return &ActionValue{Type: ActionValueDlrDlr, Src: src0, Pos: pos} - } - - var tag string - - src = src[1:] // Remove leading $ - if strings.HasPrefix(src, "<") { - i := strings.Index(src, ">") - if i < 0 { - panic("internal error") - } - - tag = src[len("<"):i] - src = src[i+1:] - } - - if src == "$" { - return &ActionValue{Type: ActionValueDlrTagDlr, Tag: tag, Src: src0, Pos: pos} - } - - n, err := strconv.ParseInt(src, 10, 31) - if err != nil { - l.err(pos, "%v: %s", err, src) - return nil - } - - if tag != "" { - return &ActionValue{Type: ActionValueDlrTagNum, Tag: tag, Num: int(n), Src: src0, Pos: pos} - } - - return &ActionValue{Type: ActionValueDlrNum, Num: int(n), Src: src0, Pos: pos} -} - -func (l *lexer) tokenBuilder(buf *bytes.Buffer) { - in := l.Token() - switch r := in[0].Rune; { - case r == '\'': - r := in[1].Rune - if r == '\\' { - l.byteValue(buf, in[1:], '"') - return - } - - if r == '\'' { - l.errChar(in[1], "empty character literal or unescaped ' in character literal") - } - buf.WriteString(strconv.QuoteRune(r)) - default: - for _, c := range in { - buf.WriteRune(c.Rune) - } - } -} - -func (l *lexer) ident(t *Token) interface{} { - s := t.Val - if s[0] == '\'' { - s, err := strconv.Unquote(s) - if err != nil && l != nil { - l.err(t.Pos(), "%v", err) - return 0 - } - - return int([]rune(s)[0]) - } - - return s -} - -func (l *lexer) number(t *Token) int { - n, err := strconv.ParseUint(t.Val, 10, 31) - if err != nil { - l.err(t.Pos(), "%v", err) - } - return int(n) -} - -func isValidRune(r rune) bool { - return !(r >= 0xd800 && r <= 0xdfff || r > 0x10ffff) -} - -func isHex(r rune) bool { - return r >= '0' && r <= '9' || r >= 'a' && r <= 'f' || r >= 'A' && r <= 'F' -} - -func hexNibble(r rune) int { - if r <= '9' { - return int(r) - '0' - } - - if r >= 'a' { - return int(r) - 'a' + 10 - } - - return int(r) - 'A' + 10 -} - -func runeClass(r rune) int { - if r >= 0 && r < 0x80 { - return int(r) - } - - if r == lex.RuneEOF { - return ccEOF - } - - return ccOther -} - -func exampleAST(rule int, src string) interface{} { - r := bytes.NewBufferString(src) - file := token.NewFileSet().AddFile("example.y", -1, len(src)) - lx, err := newLexer(file, r) - if err != nil { - return fmt.Errorf("failed: %v", err) - } - - lx.exampleRule = rule - yyParse(lx) - return lx.example -} - -func prettyString(v interface{}) string { - var b bytes.Buffer - prettyPrint(&b, v) - return b.String() -} - -func prettyPrint(w io.Writer, v interface{}) { - if v == nil { - return - } - - f := strutil.IndentFormatter(w, "· ") - - defer func() { - if e := recover(); e != nil { - f.Format("\npanic: %v", e) - } - }() - - prettyPrint0(nil, f, "", "", v) -} - -func prettyPrint0(protect map[interface{}]struct{}, sf strutil.Formatter, prefix, suffix string, v interface{}) { - if v == nil { - return - } - - switch x := v.(type) { - case *Token: - if x == nil { - return - } - - sf.Format("%s%v"+suffix, prefix, x.String()) - return - } - - rt := reflect.TypeOf(v) - rv := reflect.ValueOf(v) - switch rt.Kind() { - case reflect.Slice: - if rv.Len() == 0 { - return - } - - sf.Format("%s[]%T{ // len %d%i\n", prefix, rv.Index(0).Interface(), rv.Len()) - for i := 0; i < rv.Len(); i++ { - prettyPrint0(protect, sf, fmt.Sprintf("%d: ", i), ",\n", rv.Index(i).Interface()) - } - sf.Format("%u}" + suffix) - case reflect.Struct: - sf.Format("%s%T{%i\n", prefix, v) - for i := 0; i < rt.NumField(); i++ { - f := rv.Field(i) - if !f.CanInterface() { - continue - } - - prettyPrint0(protect, sf, fmt.Sprintf("%s: ", rt.Field(i).Name), ",\n", f.Interface()) - } - sf.Format("%u}" + suffix) - case reflect.Ptr: - if rv.IsNil() { - return - } - - rvi := rv.Interface() - if _, ok := protect[rvi]; ok { - sf.Format("%s&%T{ /* recursive/repetitive pointee not shown */ }"+suffix, prefix, rv.Elem().Interface()) - return - } - - if protect == nil { - protect = map[interface{}]struct{}{} - } - protect[rvi] = struct{}{} - prettyPrint0(protect, sf, prefix+"&", suffix, rv.Elem().Interface()) - case reflect.Int, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int8: - if v := rv.Int(); v != 0 { - sf.Format("%s%v"+suffix, prefix, v) - } - case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint8: - if v := rv.Uint(); v != 0 { - sf.Format("%s%v"+suffix, prefix, rv.Uint()) - } - case reflect.Bool: - if v := rv.Bool(); v { - sf.Format("%s%v"+suffix, prefix, rv.Bool()) - } - case reflect.String: - s := rv.Interface().(string) - if s == "" { - return - } - - sf.Format("%s%q"+suffix, prefix, s) - case reflect.Map: - keys := rv.MapKeys() - if len(keys) == 0 { - return - } - - var buf bytes.Buffer - nf := strutil.IndentFormatter(&buf, "· ") - var skeys []string - for i, k := range keys { - prettyPrint0(protect, nf, "", "", k.Interface()) - skeys = append(skeys, fmt.Sprintf("%s%10d", buf.Bytes(), i)) - } - sort.Strings(skeys) - sf.Format("%s%T{%i\n", prefix, v) - for _, k := range skeys { - si := strings.TrimSpace(k[len(k)-10:]) - k = k[:len(k)-10] - n, _ := strconv.ParseUint(si, 10, 64) - mv := rv.MapIndex(keys[n]) - prettyPrint0(protect, sf, fmt.Sprintf("%s: ", k), ",\n", mv.Interface()) - } - sf.Format("%u}" + suffix) - default: - panic(fmt.Sprintf("prettyPrint: missing support for reflect.Kind == %v", rt.Kind())) - } -} - -func (r *Rule) collect() { - for n := r.RuleItemList; n != nil; n = n.RuleItemList { - switch n.Case { - case 0: // /* empty */ - return - case 1: // RuleItemList IDENTIFIER - r.Body = append(r.Body, (*lexer)(nil).ident(n.Token)) - case 2: // RuleItemList Action - r.Body = append(r.Body, n.Action) - case 3: // RuleItemList STRING_LITERAL - r.Body = append(r.Body, n.Token.Val) - } - } - p := r.Precedence - if p == nil { - return - } - - for p != nil && p.Case == 3 { // Precedence ';' - p = p.Precedence - } - - if p != nil && p.Action != nil { - r.Body = append(r.Body, p.Action) - } -} diff --git a/vendor/github.com/cznic/parser/yacc/parser.go b/vendor/github.com/cznic/parser/yacc/parser.go deleted file mode 100644 index c4f762f895759..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/parser.go +++ /dev/null @@ -1,938 +0,0 @@ -// CAUTION: Generated file - DO NOT EDIT. - -// Copyright 2015 The parser 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 is a derived work base on the original at -// -// http://pubs.opengroup.org/onlinepubs/009695399/utilities/yacc.html -// -// The original work is -// -// Copyright © 2001-2004 The IEEE and The Open Group, All Rights reserved. -// -// Grammar for the input to yacc. - -package parser - -import __yyfmt__ "fmt" - -import ( - "go/token" -) - -type yySymType struct { - yys int - node Node - Token *Token -} - -type yyXError struct { - state, xsym int -} - -const ( - yyDefault = 57366 - yyEofCode = 57344 - COMMENT = 57346 - C_IDENTIFIER = 57347 - ERROR_VERBOSE = 57348 - IDENTIFIER = 57349 - LCURL = 57350 - LEFT = 57351 - MARK = 57352 - NONASSOC = 57353 - NUMBER = 57354 - PREC = 57355 - PRECEDENCE = 57356 - RCURL = 57357 - RIGHT = 57358 - START = 57359 - STRING_LITERAL = 57360 - TOKEN = 57361 - TYPE = 57362 - UNION = 57363 - yyErrCode = 57345 - - yyMaxDepth = 200 - yyTabOfs = -42 -) - -var ( - yyXLAT = map[int]int{ - 57352: 0, // MARK (43x) - 57349: 1, // IDENTIFIER (32x) - 57348: 2, // ERROR_VERBOSE (25x) - 57350: 3, // LCURL (25x) - 57351: 4, // LEFT (25x) - 57353: 5, // NONASSOC (25x) - 57356: 6, // PRECEDENCE (25x) - 57358: 7, // RIGHT (25x) - 57359: 8, // START (25x) - 57361: 9, // TOKEN (25x) - 57362: 10, // TYPE (25x) - 57363: 11, // UNION (25x) - 57344: 12, // $end (21x) - 57347: 13, // C_IDENTIFIER (19x) - 124: 14, // '|' (18x) - 59: 15, // ';' (16x) - 57360: 16, // STRING_LITERAL (12x) - 123: 17, // '{' (11x) - 57355: 18, // PREC (10x) - 44: 19, // ',' (9x) - 60: 20, // '<' (7x) - 57367: 21, // Action (4x) - 57371: 22, // Name (3x) - 57373: 23, // Precedence (3x) - 57376: 24, // RuleItemList (3x) - 125: 25, // '}' (2x) - 57370: 26, // LiteralStringOpt (2x) - 57357: 27, // RCURL (2x) - 57364: 28, // $@1 (1x) - 57365: 29, // $@2 (1x) - 62: 30, // '>' (1x) - 57368: 31, // Definition (1x) - 57369: 32, // DefinitionList (1x) - 57372: 33, // NameList (1x) - 57354: 34, // NUMBER (1x) - 57374: 35, // ReservedWord (1x) - 57375: 36, // Rule (1x) - 57377: 37, // RuleList (1x) - 57378: 38, // Specification (1x) - 57379: 39, // Tag (1x) - 57380: 40, // Tail (1x) - 57366: 41, // $default (0x) - 57346: 42, // COMMENT (0x) - 57345: 43, // error (0x) - } - - yySymNames = []string{ - "MARK", - "IDENTIFIER", - "ERROR_VERBOSE", - "LCURL", - "LEFT", - "NONASSOC", - "PRECEDENCE", - "RIGHT", - "START", - "TOKEN", - "TYPE", - "UNION", - "$end", - "C_IDENTIFIER", - "'|'", - "';'", - "STRING_LITERAL", - "'{'", - "PREC", - "','", - "'<'", - "Action", - "Name", - "Precedence", - "RuleItemList", - "'}'", - "LiteralStringOpt", - "RCURL", - "$@1", - "$@2", - "'>'", - "Definition", - "DefinitionList", - "NameList", - "NUMBER", - "ReservedWord", - "Rule", - "RuleList", - "Specification", - "Tag", - "Tail", - "$default", - "COMMENT", - "error", - } - - yyTokenLiteralStrings = map[int]string{ - 57352: "%%", - 57349: "identifier", - 57348: "%error-verbose", - 57350: "%{", - 57351: "%left", - 57353: "%nonassoc", - 57356: "%precedence", - 57358: "%right", - 57359: "%start", - 57361: "%token", - 57362: "%type", - 57363: "%union", - 57347: "rule name", - 57360: "string literal", - 57355: "%prec", - 57357: "%}", - 57354: "number", - } - - yyReductions = map[int]struct{ xsym, components int }{ - 0: {0, 1}, - 1: {28, 0}, - 2: {21, 3}, - 3: {31, 2}, - 4: {31, 1}, - 5: {29, 0}, - 6: {31, 3}, - 7: {31, 3}, - 8: {31, 2}, - 9: {31, 1}, - 10: {32, 0}, - 11: {32, 2}, - 12: {26, 0}, - 13: {26, 1}, - 14: {22, 2}, - 15: {22, 3}, - 16: {33, 1}, - 17: {33, 2}, - 18: {33, 3}, - 19: {23, 0}, - 20: {23, 2}, - 21: {23, 3}, - 22: {23, 2}, - 23: {35, 1}, - 24: {35, 1}, - 25: {35, 1}, - 26: {35, 1}, - 27: {35, 1}, - 28: {35, 1}, - 29: {36, 3}, - 30: {36, 3}, - 31: {24, 0}, - 32: {24, 2}, - 33: {24, 2}, - 34: {24, 2}, - 35: {37, 3}, - 36: {37, 2}, - 37: {38, 4}, - 38: {39, 0}, - 39: {39, 3}, - 40: {40, 1}, - 41: {40, 0}, - } - - yyXErrors = map[yyXError]string{ - yyXError{0, 12}: "invalid empty input", - yyXError{1, -1}: "expected $end", - yyXError{21, -1}: "expected $end", - yyXError{22, -1}: "expected $end", - yyXError{5, -1}: "expected %}", - yyXError{53, -1}: "expected %}", - yyXError{41, -1}: "expected '>'", - yyXError{24, -1}: "expected '}'", - yyXError{33, -1}: "expected '}'", - yyXError{23, -1}: "expected Action or Precedence or one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{35, -1}: "expected Action or Precedence or one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{37, -1}: "expected Action or Precedence or one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{31, -1}: "expected Action or one of [$end, %%, ';', '{', '|', rule name]", - yyXError{2, -1}: "expected Definition or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - yyXError{44, -1}: "expected LiteralStringOpt or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier, number, string literal]", - yyXError{48, -1}: "expected LiteralStringOpt or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier, string literal]", - yyXError{51, -1}: "expected Name or identifier", - yyXError{43, -1}: "expected Name or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{6, -1}: "expected NameList or Tag or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{39, -1}: "expected NameList or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, identifier]", - yyXError{16, -1}: "expected Precedence or RuleItemList or one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{18, -1}: "expected Precedence or RuleItemList or one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{19, -1}: "expected Precedence or RuleItemList or one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{17, -1}: "expected Rule or Tail or one of [$end, %%, '|', rule name]", - yyXError{15, -1}: "expected RuleList or rule name", - yyXError{0, -1}: "expected Specification or one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - yyXError{3, -1}: "expected identifier", - yyXError{25, -1}: "expected identifier", - yyXError{40, -1}: "expected identifier", - yyXError{27, -1}: "expected one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{28, -1}: "expected one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{29, -1}: "expected one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{34, -1}: "expected one of [$end, %%, %prec, ';', '{', '|', identifier, rule name, string literal]", - yyXError{26, -1}: "expected one of [$end, %%, ';', '|', rule name]", - yyXError{30, -1}: "expected one of [$end, %%, ';', '|', rule name]", - yyXError{32, -1}: "expected one of [$end, %%, ';', '|', rule name]", - yyXError{36, -1}: "expected one of [$end, %%, ';', '|', rule name]", - yyXError{38, -1}: "expected one of [$end, %%, ';', '|', rule name]", - yyXError{20, -1}: "expected one of [$end, %%, '|', rule name]", - yyXError{45, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{46, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{47, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{49, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{50, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{52, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, ',', identifier]", - yyXError{9, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{10, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{11, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{12, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{13, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{14, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, '<', identifier]", - yyXError{42, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{, identifier]", - yyXError{4, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - yyXError{7, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - yyXError{8, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - yyXError{54, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - yyXError{55, -1}: "expected one of [%%, %error-verbose, %left, %nonassoc, %precedence, %right, %start, %token, %type, %union, %{]", - } - - yyParseTab = [56][]uint8{ - // 0 - {32, 2: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32: 44, 38: 43}, - {12: 42}, - {57, 2: 49, 47, 52, 54, 56, 53, 45, 51, 55, 46, 31: 50, 35: 48}, - {1: 97}, - {38, 2: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, - // 5 - {27: 37, 29: 95}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 20: 82, 39: 81}, - {33, 2: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, - {31, 2: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20: 19}, - // 10 - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20: 18}, - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 20: 17}, - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20: 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 20: 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 20: 14}, - // 15 - {13: 58, 37: 59}, - {11, 11, 12: 11, 11, 11, 11, 11, 11, 11, 24: 79}, - {64, 12: 1, 60, 61, 36: 62, 40: 63}, - {11, 11, 12: 11, 11, 11, 11, 11, 11, 11, 24: 77}, - {11, 11, 12: 11, 11, 11, 11, 11, 11, 11, 24: 65}, - // 20 - {6, 12: 6, 6, 6}, - {12: 5}, - {12: 2}, - {23, 69, 12: 23, 23, 23, 23, 71, 66, 67, 21: 70, 23: 68}, - {25: 41, 28: 75}, - // 25 - {1: 73}, - {12, 12: 12, 12, 12, 72}, - {10, 10, 12: 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 12: 9, 9, 9, 9, 9, 9, 9}, - {8, 8, 12: 8, 8, 8, 8, 8, 8, 8}, - // 30 - {20, 12: 20, 20, 20, 20}, - {22, 12: 22, 22, 22, 22, 17: 66, 21: 74}, - {21, 12: 21, 21, 21, 21}, - {25: 76}, - {40, 40, 12: 40, 40, 40, 40, 40, 40, 40}, - // 35 - {23, 69, 12: 23, 23, 23, 23, 71, 66, 67, 21: 70, 23: 78}, - {13, 12: 13, 13, 13, 72}, - {23, 69, 12: 23, 23, 23, 23, 71, 66, 67, 21: 70, 23: 80}, - {7, 12: 7, 7, 7, 72}, - {34, 86, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 22: 87, 33: 85}, - // 40 - {1: 83}, - {30: 84}, - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {35, 86, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 19: 93, 22: 92}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 16: 88, 19: 30, 26: 89, 34: 90}, - // 45 - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 19: 26}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 19: 29}, - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 19: 28}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 16: 88, 19: 30, 26: 91}, - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 19: 27}, - // 50 - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 19: 25}, - {1: 86, 22: 94}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 19: 24}, - {27: 96}, - {36, 2: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - // 55 - {39, 2: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, - } -) - -var yyDebug = 0 - -type yyLexer interface { - Lex(lval *yySymType) int - Error(s string) -} - -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] - } - - if c < 0x7f { - return __yyfmt__.Sprintf("'%c'", c) - } - - 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), prettyString(lval.Token): %v\n", yySymName(n), n, n, prettyString(lval.Token)) - } - return n -} - -func yyParse(yylex yyLexer) int { - const yyError = 43 - - yyEx, _ := yylex.(yyLexerEx) - var yyn int - var yylval yySymType - var yyVAL yySymType - yyS := make([]yySymType, 200) - - 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 - } - yyS[yyp] = yyVAL - yyS[yyp].yys = yystate - -yynewstate: - if yychar < 0 { - yychar = yylex1(yylex, &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 - yyVAL = 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 yychar > 0 { - ls := yyTokenLiteralStrings[yychar] - if ls == "" { - ls = yySymName(yychar) - } - if ls != "" { - switch { - case msg == "": - msg = __yyfmt__.Sprintf("unexpected %s", ls) - default: - msg = __yyfmt__.Sprintf("unexpected %s, %s", ls, msg) - } - } - } - if msg == "" { - msg = "syntax error" - } - yylex.Error(msg) - 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 - } - 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 1: - { - lx := yylex.(*lexer) - lx.values2 = append([]string(nil), lx.values...) - lx.positions2 = append([]token.Pos(nil), lx.positions...) - } - case 2: - { - lx := yylex.(*lexer) - lhs := &Action{ - Token: yyS[yypt-2].Token, - Token2: yyS[yypt-0].Token, - } - yyVAL.node = lhs - for i, v := range lx.values2 { - a := lx.parseActionValue(lx.positions2[i], v) - if a != nil { - lhs.Values = append(lhs.Values, a) - } - } - } - case 3: - { - yyVAL.node = &Definition{ - Token: yyS[yypt-1].Token, - Token2: yyS[yypt-0].Token, - } - } - case 4: - { - lx := yylex.(*lexer) - lhs := &Definition{ - Case: 1, - Token: yyS[yypt-0].Token, - } - yyVAL.node = lhs - lhs.Value = lx.value - } - case 5: - { - lx := yylex.(*lexer) - lx.pos2 = lx.pos - lx.value2 = lx.value - } - case 6: - { - lx := yylex.(*lexer) - lhs := &Definition{ - Case: 2, - Token: yyS[yypt-2].Token, - Token2: yyS[yypt-0].Token, - } - yyVAL.node = lhs - lhs.Value = lx.value2 - } - case 7: - { - lhs := &Definition{ - Case: 3, - ReservedWord: yyS[yypt-2].node.(*ReservedWord), - Tag: yyS[yypt-1].node.(*Tag), - NameList: yyS[yypt-0].node.(*NameList).reverse(), - } - yyVAL.node = lhs - for n := lhs.NameList; n != nil; n = n.NameList { - lhs.Nlist = append(lhs.Nlist, n.Name) - } - } - case 8: - { - yyVAL.node = &Definition{ - Case: 4, - ReservedWord: yyS[yypt-1].node.(*ReservedWord), - Tag: yyS[yypt-0].node.(*Tag), - } - } - case 9: - { - yyVAL.node = &Definition{ - Case: 5, - Token: yyS[yypt-0].Token, - } - } - case 10: - { - yyVAL.node = (*DefinitionList)(nil) - } - case 11: - { - lx := yylex.(*lexer) - lhs := &DefinitionList{ - DefinitionList: yyS[yypt-1].node.(*DefinitionList), - Definition: yyS[yypt-0].node.(*Definition), - } - yyVAL.node = lhs - lx.defs = append(lx.defs, lhs.Definition) - } - case 12: - { - yyVAL.node = (*LiteralStringOpt)(nil) - } - case 13: - { - yyVAL.node = &LiteralStringOpt{ - Token: yyS[yypt-0].Token, - } - } - case 14: - { - lx := yylex.(*lexer) - lhs := &Name{ - Token: yyS[yypt-1].Token, - LiteralStringOpt: yyS[yypt-0].node.(*LiteralStringOpt), - } - yyVAL.node = lhs - lhs.Identifier = lx.ident(lhs.Token) - lhs.Number = -1 - } - case 15: - { - lx := yylex.(*lexer) - lhs := &Name{ - Case: 1, - Token: yyS[yypt-2].Token, - Token2: yyS[yypt-1].Token, - LiteralStringOpt: yyS[yypt-0].node.(*LiteralStringOpt), - } - yyVAL.node = lhs - lhs.Identifier = lx.ident(lhs.Token) - lhs.Number = lx.number(lhs.Token2) - } - case 16: - { - yyVAL.node = &NameList{ - Name: yyS[yypt-0].node.(*Name), - } - } - case 17: - { - yyVAL.node = &NameList{ - Case: 1, - NameList: yyS[yypt-1].node.(*NameList), - Name: yyS[yypt-0].node.(*Name), - } - } - case 18: - { - yyVAL.node = &NameList{ - Case: 2, - NameList: yyS[yypt-2].node.(*NameList), - Token: yyS[yypt-1].Token, - Name: yyS[yypt-0].node.(*Name), - } - } - case 19: - { - yyVAL.node = (*Precedence)(nil) - } - case 20: - { - lx := yylex.(*lexer) - lhs := &Precedence{ - Case: 1, - Token: yyS[yypt-1].Token, - Token2: yyS[yypt-0].Token, - } - yyVAL.node = lhs - lhs.Identifier = lx.ident(lhs.Token2) - } - case 21: - { - lx := yylex.(*lexer) - lhs := &Precedence{ - Case: 2, - Token: yyS[yypt-2].Token, - Token2: yyS[yypt-1].Token, - Action: yyS[yypt-0].node.(*Action), - } - yyVAL.node = lhs - lhs.Identifier = lx.ident(lhs.Token2) - } - case 22: - { - yyVAL.node = &Precedence{ - Case: 3, - Precedence: yyS[yypt-1].node.(*Precedence), - Token: yyS[yypt-0].Token, - } - } - case 23: - { - yyVAL.node = &ReservedWord{ - Token: yyS[yypt-0].Token, - } - } - case 24: - { - yyVAL.node = &ReservedWord{ - Case: 1, - Token: yyS[yypt-0].Token, - } - } - case 25: - { - yyVAL.node = &ReservedWord{ - Case: 2, - Token: yyS[yypt-0].Token, - } - } - case 26: - { - yyVAL.node = &ReservedWord{ - Case: 3, - Token: yyS[yypt-0].Token, - } - } - case 27: - { - yyVAL.node = &ReservedWord{ - Case: 4, - Token: yyS[yypt-0].Token, - } - } - case 28: - { - yyVAL.node = &ReservedWord{ - Case: 5, - Token: yyS[yypt-0].Token, - } - } - case 29: - { - lx := yylex.(*lexer) - lhs := &Rule{ - Token: yyS[yypt-2].Token, - RuleItemList: yyS[yypt-1].node.(*RuleItemList).reverse(), - Precedence: yyS[yypt-0].node.(*Precedence), - } - yyVAL.node = lhs - lx.ruleName = lhs.Token - lhs.Name = lhs.Token - } - case 30: - { - lx := yylex.(*lexer) - lhs := &Rule{ - Case: 1, - Token: yyS[yypt-2].Token, - RuleItemList: yyS[yypt-1].node.(*RuleItemList).reverse(), - Precedence: yyS[yypt-0].node.(*Precedence), - } - yyVAL.node = lhs - lhs.Name = lx.ruleName - } - case 31: - { - yyVAL.node = (*RuleItemList)(nil) - } - case 32: - { - yyVAL.node = &RuleItemList{ - Case: 1, - RuleItemList: yyS[yypt-1].node.(*RuleItemList), - Token: yyS[yypt-0].Token, - } - } - case 33: - { - yyVAL.node = &RuleItemList{ - Case: 2, - RuleItemList: yyS[yypt-1].node.(*RuleItemList), - Action: yyS[yypt-0].node.(*Action), - } - } - case 34: - { - yyVAL.node = &RuleItemList{ - Case: 3, - RuleItemList: yyS[yypt-1].node.(*RuleItemList), - Token: yyS[yypt-0].Token, - } - } - case 35: - { - lx := yylex.(*lexer) - lhs := &RuleList{ - Token: yyS[yypt-2].Token, - RuleItemList: yyS[yypt-1].node.(*RuleItemList).reverse(), - Precedence: yyS[yypt-0].node.(*Precedence), - } - yyVAL.node = lhs - lx.ruleName = lhs.Token - rule := &Rule{ - Token: lhs.Token, - Name: lhs.Token, - RuleItemList: lhs.RuleItemList, - Precedence: lhs.Precedence, - } - rule.collect() - lx.rules = append(lx.rules, rule) - } - case 36: - { - lx := yylex.(*lexer) - lhs := &RuleList{ - Case: 1, - RuleList: yyS[yypt-1].node.(*RuleList), - Rule: yyS[yypt-0].node.(*Rule), - } - yyVAL.node = lhs - rule := lhs.Rule - rule.collect() - lx.rules = append(lx.rules, rule) - } - case 37: - { - lx := yylex.(*lexer) - lhs := &Specification{ - DefinitionList: yyS[yypt-3].node.(*DefinitionList).reverse(), - Token: yyS[yypt-2].Token, - RuleList: yyS[yypt-1].node.(*RuleList).reverse(), - Tail: yyS[yypt-0].node.(*Tail), - } - yyVAL.node = lhs - lhs.Defs = lx.defs - lhs.Rules = lx.rules - lx.spec = lhs - } - case 38: - { - yyVAL.node = (*Tag)(nil) - } - case 39: - { - yyVAL.node = &Tag{ - Token: yyS[yypt-2].Token, - Token2: yyS[yypt-1].Token, - Token3: yyS[yypt-0].Token, - } - } - case 40: - { - lx := yylex.(*lexer) - lhs := &Tail{ - Token: yyS[yypt-0].Token, - } - yyVAL.node = lhs - lhs.Value = lx.value - } - case 41: - { - yyVAL.node = (*Tail)(nil) - } - - } - - if yyEx != nil && yyEx.Reduced(r, exState, &yyVAL) { - return -1 - } - goto yystack /* stack new state and value */ -} diff --git a/vendor/github.com/cznic/parser/yacc/scanner.go b/vendor/github.com/cznic/parser/yacc/scanner.go deleted file mode 100644 index 03c53066f039a..0000000000000 --- a/vendor/github.com/cznic/parser/yacc/scanner.go +++ /dev/null @@ -1,856 +0,0 @@ -// CAUTION: Generated file - DO NOT EDIT. - -// Copyright 2015 The parser Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// CAUTION: Generated file (unless this is y.l) - DO NOT EDIT! - -package parser - -import ( - "github.com/cznic/golex/lex" -) - -func (l *lexer) scan() lex.Char { - c := l.Enter() - -yystate0: - yyrule := -1 - _ = yyrule - c = l.Rule0() - - goto yystart1 - - goto yystate0 // silence unused label error - goto yyAction // silence unused label error -yyAction: - switch yyrule { - case 1: - goto yyrule1 - case 2: - goto yyrule2 - case 3: - goto yyrule3 - case 4: - goto yyrule4 - case 5: - goto yyrule5 - case 6: - goto yyrule6 - case 7: - goto yyrule7 - case 8: - goto yyrule8 - case 9: - goto yyrule9 - case 10: - goto yyrule10 - case 11: - goto yyrule11 - case 12: - goto yyrule12 - case 13: - goto yyrule13 - case 14: - goto yyrule14 - case 15: - goto yyrule15 - case 16: - goto yyrule16 - case 17: - goto yyrule17 - case 18: - goto yyrule18 - case 19: - goto yyrule19 - } - goto yystate1 // silence unused label error -yystate1: - c = l.Next() -yystart1: - switch { - default: - goto yyabort - case c == '"': - goto yystate3 - case c == '%': - goto yystate6 - case c == '/': - goto yystate71 - case c == '\'': - goto yystate68 - case c == '\t' || c == '\n' || c == '\f' || c == '\r' || c == ' ': - goto yystate2 - case c >= '0' && c <= '9': - goto yystate76 - case c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate77 - } - -yystate2: - c = l.Next() - yyrule = 1 - l.Mark() - goto yyrule1 - -yystate3: - c = l.Next() - switch { - default: - goto yyabort - case c == '"': - goto yystate4 - case c == '\\': - goto yystate5 - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate3 - } - -yystate4: - c = l.Next() - yyrule = 19 - l.Mark() - goto yyrule19 - -yystate5: - c = l.Next() - switch { - default: - goto yyabort - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate3 - } - -yystate6: - c = l.Next() - switch { - default: - goto yyabort - case c == '%': - goto yystate7 - case c == 'e': - goto yystate8 - case c == 'l': - goto yystate21 - case c == 'n': - goto yystate25 - case c == 'p': - goto yystate33 - case c == 'r': - goto yystate43 - case c == 's': - goto yystate48 - case c == 't': - goto yystate53 - case c == 'u': - goto yystate61 - case c == '{': - goto yystate66 - case c == '}': - goto yystate67 - } - -yystate7: - c = l.Next() - yyrule = 6 - l.Mark() - goto yyrule6 - -yystate8: - c = l.Next() - switch { - default: - goto yyabort - case c == 'r': - goto yystate9 - } - -yystate9: - c = l.Next() - switch { - default: - goto yyabort - case c == 'r': - goto yystate10 - } - -yystate10: - c = l.Next() - switch { - default: - goto yyabort - case c == 'o': - goto yystate11 - } - -yystate11: - c = l.Next() - switch { - default: - goto yyabort - case c == 'r': - goto yystate12 - } - -yystate12: - c = l.Next() - switch { - default: - goto yyabort - case c == '-': - goto yystate13 - } - -yystate13: - c = l.Next() - switch { - default: - goto yyabort - case c == 'v': - goto yystate14 - } - -yystate14: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate15 - } - -yystate15: - c = l.Next() - switch { - default: - goto yyabort - case c == 'r': - goto yystate16 - } - -yystate16: - c = l.Next() - switch { - default: - goto yyabort - case c == 'b': - goto yystate17 - } - -yystate17: - c = l.Next() - switch { - default: - goto yyabort - case c == 'o': - goto yystate18 - } - -yystate18: - c = l.Next() - switch { - default: - goto yyabort - case c == 's': - goto yystate19 - } - -yystate19: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate20 - } - -yystate20: - c = l.Next() - yyrule = 16 - l.Mark() - goto yyrule16 - -yystate21: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate22 - } - -yystate22: - c = l.Next() - switch { - default: - goto yyabort - case c == 'f': - goto yystate23 - } - -yystate23: - c = l.Next() - switch { - default: - goto yyabort - case c == 't': - goto yystate24 - } - -yystate24: - c = l.Next() - yyrule = 7 - l.Mark() - goto yyrule7 - -yystate25: - c = l.Next() - switch { - default: - goto yyabort - case c == 'o': - goto yystate26 - } - -yystate26: - c = l.Next() - switch { - default: - goto yyabort - case c == 'n': - goto yystate27 - } - -yystate27: - c = l.Next() - switch { - default: - goto yyabort - case c == 'a': - goto yystate28 - } - -yystate28: - c = l.Next() - switch { - default: - goto yyabort - case c == 's': - goto yystate29 - } - -yystate29: - c = l.Next() - switch { - default: - goto yyabort - case c == 's': - goto yystate30 - } - -yystate30: - c = l.Next() - switch { - default: - goto yyabort - case c == 'o': - goto yystate31 - } - -yystate31: - c = l.Next() - switch { - default: - goto yyabort - case c == 'c': - goto yystate32 - } - -yystate32: - c = l.Next() - yyrule = 8 - l.Mark() - goto yyrule8 - -yystate33: - c = l.Next() - switch { - default: - goto yyabort - case c == 'r': - goto yystate34 - } - -yystate34: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate35 - } - -yystate35: - c = l.Next() - switch { - default: - goto yyabort - case c == 'c': - goto yystate36 - } - -yystate36: - c = l.Next() - yyrule = 9 - l.Mark() - switch { - default: - goto yyrule9 - case c == 'e': - goto yystate37 - } - -yystate37: - c = l.Next() - switch { - default: - goto yyabort - case c == 'd': - goto yystate38 - } - -yystate38: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate39 - } - -yystate39: - c = l.Next() - switch { - default: - goto yyabort - case c == 'n': - goto yystate40 - } - -yystate40: - c = l.Next() - switch { - default: - goto yyabort - case c == 'c': - goto yystate41 - } - -yystate41: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate42 - } - -yystate42: - c = l.Next() - yyrule = 10 - l.Mark() - goto yyrule10 - -yystate43: - c = l.Next() - switch { - default: - goto yyabort - case c == 'i': - goto yystate44 - } - -yystate44: - c = l.Next() - switch { - default: - goto yyabort - case c == 'g': - goto yystate45 - } - -yystate45: - c = l.Next() - switch { - default: - goto yyabort - case c == 'h': - goto yystate46 - } - -yystate46: - c = l.Next() - switch { - default: - goto yyabort - case c == 't': - goto yystate47 - } - -yystate47: - c = l.Next() - yyrule = 11 - l.Mark() - goto yyrule11 - -yystate48: - c = l.Next() - switch { - default: - goto yyabort - case c == 't': - goto yystate49 - } - -yystate49: - c = l.Next() - switch { - default: - goto yyabort - case c == 'a': - goto yystate50 - } - -yystate50: - c = l.Next() - switch { - default: - goto yyabort - case c == 'r': - goto yystate51 - } - -yystate51: - c = l.Next() - switch { - default: - goto yyabort - case c == 't': - goto yystate52 - } - -yystate52: - c = l.Next() - yyrule = 12 - l.Mark() - goto yyrule12 - -yystate53: - c = l.Next() - switch { - default: - goto yyabort - case c == 'o': - goto yystate54 - case c == 'y': - goto yystate58 - } - -yystate54: - c = l.Next() - switch { - default: - goto yyabort - case c == 'k': - goto yystate55 - } - -yystate55: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate56 - } - -yystate56: - c = l.Next() - switch { - default: - goto yyabort - case c == 'n': - goto yystate57 - } - -yystate57: - c = l.Next() - yyrule = 13 - l.Mark() - goto yyrule13 - -yystate58: - c = l.Next() - switch { - default: - goto yyabort - case c == 'p': - goto yystate59 - } - -yystate59: - c = l.Next() - switch { - default: - goto yyabort - case c == 'e': - goto yystate60 - } - -yystate60: - c = l.Next() - yyrule = 14 - l.Mark() - goto yyrule14 - -yystate61: - c = l.Next() - switch { - default: - goto yyabort - case c == 'n': - goto yystate62 - } - -yystate62: - c = l.Next() - switch { - default: - goto yyabort - case c == 'i': - goto yystate63 - } - -yystate63: - c = l.Next() - switch { - default: - goto yyabort - case c == 'o': - goto yystate64 - } - -yystate64: - c = l.Next() - switch { - default: - goto yyabort - case c == 'n': - goto yystate65 - } - -yystate65: - c = l.Next() - yyrule = 15 - l.Mark() - goto yyrule15 - -yystate66: - c = l.Next() - yyrule = 4 - l.Mark() - goto yyrule4 - -yystate67: - c = l.Next() - yyrule = 5 - l.Mark() - goto yyrule5 - -yystate68: - c = l.Next() - switch { - default: - goto yyabort - case c == '\'': - goto yystate69 - case c == '\\': - goto yystate70 - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '&' || c >= '(' && c <= '[' || c >= ']' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate68 - } - -yystate69: - c = l.Next() - yyrule = 18 - l.Mark() - goto yyrule18 - -yystate70: - c = l.Next() - switch { - default: - goto yyabort - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate68 - } - -yystate71: - c = l.Next() - switch { - default: - goto yyabort - case c == '*': - goto yystate72 - case c == '/': - goto yystate75 - } - -yystate72: - c = l.Next() - switch { - default: - goto yyabort - case c == '*': - goto yystate73 - case c >= '\x01' && c <= ')' || c >= '+' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate72 - } - -yystate73: - c = l.Next() - switch { - default: - goto yyabort - case c == '*': - goto yystate73 - case c == '/': - goto yystate74 - case c >= '\x01' && c <= ')' || c >= '+' && c <= '.' || c >= '0' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate72 - } - -yystate74: - c = l.Next() - yyrule = 3 - l.Mark() - goto yyrule3 - -yystate75: - c = l.Next() - yyrule = 2 - l.Mark() - switch { - default: - goto yyrule2 - case c >= '\x01' && c <= '\t' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\u007f' || c >= '\u0081' && c <= 'ÿ': - goto yystate75 - } - -yystate76: - c = l.Next() - yyrule = 17 - l.Mark() - switch { - default: - goto yyrule17 - case c >= '0' && c <= '9': - goto yystate76 - } - -yystate77: - c = l.Next() - yyrule = 18 - l.Mark() - switch { - default: - goto yyrule18 - case c == '.' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate77 - } - -yyrule1: // [ \n\r\t\f] - - goto yystate0 -yyrule2: // "//"[^\x80\n\r]* -yyrule3: // "/*"([^*\x80]|\*+[^*/\x80])*\*+\/ - { - - return l.char(COMMENT) - } -yyrule4: // %"{" - { - return l.char(LCURL) - } -yyrule5: // %"}" - { - return l.char(RCURL) - } -yyrule6: // %% - { - return l.char(MARK) - } -yyrule7: // %left - { - return l.char(LEFT) - } -yyrule8: // %nonassoc - { - return l.char(NONASSOC) - } -yyrule9: // %prec - { - return l.char(PREC) - } -yyrule10: // %precedence - { - return l.char(PRECEDENCE) - } -yyrule11: // %right - { - return l.char(RIGHT) - } -yyrule12: // %start - { - return l.char(START) - } -yyrule13: // %token - { - return l.char(TOKEN) - } -yyrule14: // %type - { - return l.char(TYPE) - } -yyrule15: // %union - { - return l.char(UNION) - } -yyrule16: // %error-verbose - { - return l.char(ERROR_VERBOSE) - } -yyrule17: // [0-9]+ - { - return l.char(NUMBER) - } -yyrule18: // {identifier} - { - return l.char(IDENTIFIER) - } -yyrule19: // {str-literal} - { - return l.char(STRING_LITERAL) - } - panic("unreachable") - - goto yyabort // silence unused label error - -yyabort: // no lexem recognized - if c, ok := l.Abort(); ok { - return l.char(c) - } - - goto yyAction -} diff --git a/vendor/github.com/cznic/strutil/LICENSE b/vendor/github.com/cznic/strutil/LICENSE deleted file mode 100644 index 2fdd92cf71397..0000000000000 --- a/vendor/github.com/cznic/strutil/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014 The strutil Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the names of the authors nor the names of the -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/strutil/strutil.go b/vendor/github.com/cznic/strutil/strutil.go deleted file mode 100644 index 9876e1794f8fd..0000000000000 --- a/vendor/github.com/cznic/strutil/strutil.go +++ /dev/null @@ -1,645 +0,0 @@ -// 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 LICENSE file. - -// Package strutil collects utils supplemental to the standard strings package. -package strutil - -import ( - "bytes" - "encoding/base32" - "encoding/base64" - "fmt" - "io" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -// Base32ExtDecode decodes base32 extended (RFC 4648) text to binary data. -func Base32ExtDecode(text []byte) (data []byte, err error) { - n := base32.HexEncoding.DecodedLen(len(text)) - data = make([]byte, n) - decoder := base32.NewDecoder(base32.HexEncoding, bytes.NewBuffer(text)) - if n, err = decoder.Read(data); err != nil { - n = 0 - } - data = data[:n] - return -} - -// Base32ExtEncode encodes binary data to base32 extended (RFC 4648) encoded text. -func Base32ExtEncode(data []byte) (text []byte) { - n := base32.HexEncoding.EncodedLen(len(data)) - buf := bytes.NewBuffer(make([]byte, 0, n)) - encoder := base32.NewEncoder(base32.HexEncoding, buf) - encoder.Write(data) - encoder.Close() - if buf.Len() != n { - panic("internal error") - } - return buf.Bytes() -} - -// Base64Decode decodes base64 text to binary data. -func Base64Decode(text []byte) (data []byte, err error) { - n := base64.StdEncoding.DecodedLen(len(text)) - data = make([]byte, n) - decoder := base64.NewDecoder(base64.StdEncoding, bytes.NewBuffer(text)) - if n, err = decoder.Read(data); err != nil { - n = 0 - } - data = data[:n] - return -} - -// Base64Encode encodes binary data to base64 encoded text. -func Base64Encode(data []byte) (text []byte) { - n := base64.StdEncoding.EncodedLen(len(data)) - buf := bytes.NewBuffer(make([]byte, 0, n)) - encoder := base64.NewEncoder(base64.StdEncoding, buf) - encoder.Write(data) - encoder.Close() - if buf.Len() != n { - panic("internal error") - } - return buf.Bytes() -} - -// Formatter is an io.Writer extended 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 -} - -const ( - st0 = iota - stBOL - stPERC - stBOLPERC -) - -// IndentFormatter returns a new Formatter which interprets %i and %u in the -// Format() format string as indent and undent 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) { - buf := []byte{} - 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...))) -} - -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 iff indent level is currently zero. -// -// If 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)) -} - -func (f *flatFormatter) Format(format string, args ...interface{}) (n int, errno error) { - return (*indentFormatter)(f).format(true, format, args...) -} - -// Pool handles aligning of strings having equal values to the same string instance. -// Intended use is to conserve some memory e.g. where a large number of identically valued strings -// with non identical backing arrays may exists in several semantically distinct instances of some structs. -// Pool is *not* concurrent access safe. It doesn't handle common prefix/suffix aligning, -// e.g. having s1 == "abc" and s2 == "bc", s2 is not automatically aligned as s1[1:]. -type Pool struct { - pool map[string]string -} - -// NewPool returns a newly created Pool. -func NewPool() *Pool { - return &Pool{map[string]string{}} -} - -// Align returns a string with the same value as its argument. It guarantees that -// all aligned strings share a single instance in memory. -func (p *Pool) Align(s string) string { - if a, ok := p.pool[s]; ok { - return a - } - - s = StrPack(s) - p.pool[s] = s - return s -} - -// Count returns the number of items in the pool. -func (p *Pool) Count() int { - return len(p.pool) -} - -// GoPool is a concurrent access safe version of Pool. -type GoPool struct { - pool map[string]string - rwm *sync.RWMutex -} - -// NewGoPool returns a newly created GoPool. -func NewGoPool() (p *GoPool) { - return &GoPool{map[string]string{}, &sync.RWMutex{}} -} - -// Align returns a string with the same value as its argument. It guarantees that -// all aligned strings share a single instance in memory. -func (p *GoPool) Align(s string) (y string) { - if s != "" { - p.rwm.RLock() // R++ - if a, ok := p.pool[s]; ok { // found - p.rwm.RUnlock() // R-- - return a - } - - p.rwm.RUnlock() // R-- - // not found but with a race condition, retry within a write lock - p.rwm.Lock() // W++ - defer p.rwm.Unlock() // W-- - if a, ok := p.pool[s]; ok { // done in a race - return a - } - - // we won - s = StrPack(s) - p.pool[s] = s - return s - } - - return -} - -// Count returns the number of items in the pool. -func (p *GoPool) Count() int { - return len(p.pool) -} - -// Dict is a string <-> id bijection. Dict is *not* concurrent access safe for assigning new ids -// to strings not yet contained in the bijection. -// Id for an empty string is guaranteed to be 0, -// thus Id for any non empty string is guaranteed to be non zero. -type Dict struct { - si map[string]int - is []string -} - -// NewDict returns a newly created Dict. -func NewDict() (d *Dict) { - d = &Dict{map[string]int{}, []string{}} - d.Id("") - return -} - -// Count returns the number of items in the dict. -func (d *Dict) Count() int { - return len(d.is) -} - -// Id maps string s to its numeric identificator. -func (d *Dict) Id(s string) (y int) { - if y, ok := d.si[s]; ok { - return y - } - - s = StrPack(s) - y = len(d.is) - d.si[s] = y - d.is = append(d.is, s) - return -} - -// S maps an id to its string value and ok == true. Id values not contained in the bijection -// return "", false. -func (d *Dict) S(id int) (s string, ok bool) { - if id >= len(d.is) { - return "", false - } - return d.is[id], true -} - -// GoDict is a concurrent access safe version of Dict. -type GoDict struct { - si map[string]int - is []string - rwm *sync.RWMutex -} - -// NewGoDict returns a newly created GoDict. -func NewGoDict() (d *GoDict) { - d = &GoDict{map[string]int{}, []string{}, &sync.RWMutex{}} - d.Id("") - return -} - -// Count returns the number of items in the dict. -func (d *GoDict) Count() int { - return len(d.is) -} - -// Id maps string s to its numeric identificator. The implementation honors getting -// an existing id at the cost of assigning a new one. -func (d *GoDict) Id(s string) (y int) { - d.rwm.RLock() // R++ - if y, ok := d.si[s]; ok { // found - d.rwm.RUnlock() // R-- - return y - } - - d.rwm.RUnlock() // R-- - - // not found but with a race condition - d.rwm.Lock() // W++ recheck with write lock - defer d.rwm.Unlock() // W-- - if y, ok := d.si[s]; ok { // some other goroutine won already - return y - } - - // a race free not found state => insert the string - s = StrPack(s) - y = len(d.is) - d.si[s] = y - d.is = append(d.is, s) - return -} - -// S maps an id to its string value and ok == true. Id values not contained in the bijection -// return "", false. -func (d *GoDict) S(id int) (s string, ok bool) { - d.rwm.RLock() // R++ - defer d.rwm.RUnlock() // R-- - if id >= len(d.is) { - return "", false - } - return d.is[id], true -} - -// StrPack returns a new instance of s which is tightly packed in memory. -// It is intended for avoiding the situation where having a live reference -// to a string slice over an unreferenced biger underlying string keeps the biger one -// in memory anyway - it can't be GCed. -func StrPack(s string) string { - return string([]byte(s)) -} - -// JoinFields returns strings in flds joined by sep. Flds may contain arbitrary -// bytes, including the sep as they are safely escaped. JoinFields panics if -// sep is the backslash character or if len(sep) != 1. -func JoinFields(flds []string, sep string) string { - if len(sep) != 1 || sep == "\\" { - panic("invalid separator") - } - - a := make([]string, len(flds)) - for i, v := range flds { - v = strings.Replace(v, "\\", "\\0", -1) - a[i] = strings.Replace(v, sep, "\\1", -1) - } - return strings.Join(a, sep) -} - -// SplitFields splits s, which must be produced by JoinFields using the same -// sep, into flds. SplitFields panics if sep is the backslash character or if -// len(sep) != 1. -func SplitFields(s, sep string) (flds []string) { - if len(sep) != 1 || sep == "\\" { - panic("invalid separator") - } - - a := strings.Split(s, sep) - r := make([]string, len(a)) - for i, v := range a { - v = strings.Replace(v, "\\1", sep, -1) - r[i] = strings.Replace(v, "\\0", "\\", -1) - } - return r -} - -// PrettyPrintHooks allow to customize the result of PrettyPrint for types -// listed in the map value. -type PrettyPrintHooks map[reflect.Type]func(f Formatter, v interface{}, prefix, suffix string) - -// PrettyString returns the output of PrettyPrint as a string. -func PrettyString(v interface{}, prefix, suffix string, hooks PrettyPrintHooks) string { - var b bytes.Buffer - PrettyPrint(&b, v, prefix, suffix, hooks) - return b.String() -} - -// PrettyPrint pretty prints v to w. Zero values and unexported struct fields -// are omitted. -func PrettyPrint(w io.Writer, v interface{}, prefix, suffix string, hooks PrettyPrintHooks) { - if v == nil { - return - } - - f := IndentFormatter(w, "· ") - - defer func() { - if e := recover(); e != nil { - f.Format("\npanic: %v", e) - } - }() - - prettyPrint(nil, f, prefix, suffix, v, hooks) -} - -func prettyPrint(protect map[interface{}]struct{}, sf Formatter, prefix, suffix string, v interface{}, hooks PrettyPrintHooks) { - if v == nil { - return - } - - rt := reflect.TypeOf(v) - if handler := hooks[rt]; handler != nil { - handler(sf, v, prefix, suffix) - return - } - - rv := reflect.ValueOf(v) - switch rt.Kind() { - case reflect.Slice: - if rv.Len() == 0 { - return - } - - sf.Format("%s[]%T{ // len %d%i\n", prefix, rv.Index(0).Interface(), rv.Len()) - for i := 0; i < rv.Len(); i++ { - prettyPrint(protect, sf, fmt.Sprintf("%d: ", i), ",\n", rv.Index(i).Interface(), hooks) - } - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%u}" + suffix) - case reflect.Array: - if reflect.Zero(rt).Interface() == rv.Interface() { - return - } - - sf.Format("%s[%d]%T{%i\n", prefix, rv.Len(), rv.Index(0).Interface()) - for i := 0; i < rv.Len(); i++ { - prettyPrint(protect, sf, fmt.Sprintf("%d: ", i), ",\n", rv.Index(i).Interface(), hooks) - } - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%u}" + suffix) - case reflect.Struct: - if rt.NumField() == 0 { - return - } - - if reflect.DeepEqual(reflect.Zero(rt).Interface(), rv.Interface()) { - return - } - - sf.Format("%s%T{%i\n", prefix, v) - for i := 0; i < rt.NumField(); i++ { - f := rv.Field(i) - if !f.CanInterface() { - continue - } - - prettyPrint(protect, sf, fmt.Sprintf("%s: ", rt.Field(i).Name), ",\n", f.Interface(), hooks) - } - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%u}" + suffix) - case reflect.Ptr: - if rv.IsNil() { - return - } - - rvi := rv.Interface() - if _, ok := protect[rvi]; ok { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s&%T{ /* recursive/repetitive pointee not shown */ }"+suffix, prefix, rv.Elem().Interface()) - return - } - - if protect == nil { - protect = map[interface{}]struct{}{} - } - protect[rvi] = struct{}{} - prettyPrint(protect, sf, prefix+"&", suffix, rv.Elem().Interface(), hooks) - case reflect.Int, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int8: - if v := rv.Int(); v != 0 { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%v"+suffix, prefix, v) - } - case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint8: - if v := rv.Uint(); v != 0 { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%v"+suffix, prefix, v) - } - case reflect.Float32, reflect.Float64: - if v := rv.Float(); v != 0 { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%v"+suffix, prefix, v) - } - case reflect.Complex64, reflect.Complex128: - if v := rv.Complex(); v != 0 { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%v"+suffix, prefix, v) - } - case reflect.Uintptr: - if v := rv.Uint(); v != 0 { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%v"+suffix, prefix, v) - } - case reflect.UnsafePointer: - s := fmt.Sprintf("%p", rv.Interface()) - if s == "0x0" { - return - } - - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%s"+suffix, prefix, s) - case reflect.Bool: - if v := rv.Bool(); v { - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%v"+suffix, prefix, rv.Bool()) - } - case reflect.String: - s := rv.Interface().(string) - if s == "" { - return - } - - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%q"+suffix, prefix, s) - case reflect.Chan: - if reflect.Zero(rt).Interface() == rv.Interface() { - return - } - - c := rv.Cap() - s := "" - if c != 0 { - s = fmt.Sprintf("// capacity: %d", c) - } - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%s%s %s%s"+suffix, prefix, rt.ChanDir(), rt.Elem().Name(), s) - case reflect.Func: - if rv.IsNil() { - return - } - - var in, out []string - for i := 0; i < rt.NumIn(); i++ { - x := reflect.Zero(rt.In(i)) - in = append(in, fmt.Sprintf("%T", x.Interface())) - } - if rt.IsVariadic() { - i := len(in) - 1 - in[i] = "..." + in[i][2:] - } - for i := 0; i < rt.NumOut(); i++ { - out = append(out, rt.Out(i).Name()) - } - s := "(" + strings.Join(in, ", ") + ")" - t := strings.Join(out, ", ") - if len(out) > 1 { - t = "(" + t + ")" - } - if t != "" { - t = " " + t - } - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%sfunc%s%s { ... }"+suffix, prefix, s, t) - case reflect.Map: - keys := rv.MapKeys() - if len(keys) == 0 { - return - } - - var buf bytes.Buffer - nf := IndentFormatter(&buf, "· ") - var skeys []string - for i, k := range keys { - prettyPrint(protect, nf, "", "", k.Interface(), hooks) - skeys = append(skeys, fmt.Sprintf("%s%10d", buf.Bytes(), i)) - buf.Reset() - } - sort.Strings(skeys) - sf.Format("%s%T{%i\n", prefix, v) - for _, k := range skeys { - si := strings.TrimSpace(k[len(k)-10:]) - k = k[:len(k)-10] - n, _ := strconv.ParseUint(si, 10, 64) - mv := rv.MapIndex(keys[n]) - prettyPrint(protect, sf, fmt.Sprintf("%s: ", k), ",\n", mv.Interface(), hooks) - } - suffix = strings.Replace(suffix, "%", "%%", -1) - sf.Format("%u}" + suffix) - } -} diff --git a/vendor/github.com/cznic/y/LICENSE b/vendor/github.com/cznic/y/LICENSE deleted file mode 100644 index 0fb99d630fc1d..0000000000000 --- a/vendor/github.com/cznic/y/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014 The y Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the names of the authors nor the names of the -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cznic/y/api.go b/vendor/github.com/cznic/y/api.go deleted file mode 100644 index 517bef9a7d1fa..0000000000000 --- a/vendor/github.com/cznic/y/api.go +++ /dev/null @@ -1,966 +0,0 @@ -// Copyright 2014 The y Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//TODO +Engine, and export it. - -// Package y converts .y (yacc[2]) source files to data suitable for a parser -// generator. -// -// Changelog -// -// 2015-02-23: Added methods Parser.{AcceptsEmptyInput,SkeletonXErrors}. -// -// 2015-01-16: Added Parser.Reductions and State.Reduce0 methods. -// -// 2014-12-18: Support %precedence for better bison compatibility[5]. -// -// Links -// -// Referenced from elsewhere: -// -// [0]: http://godoc.org/github.com/cznic/goyacc -// [1]: http://people.via.ecp.fr/~stilgar/doc/compilo/parser/Generating%20LR%20Syntax%20Error%20Messages.pdf -// [2]: http://dinosaur.compilertools.net/yacc/ -// [3]: http://dinosaur.compilertools.net/lex/index.html -// [4]: https://www.gnu.org/software/bison/manual/html_node/Using-Mid_002dRule-Actions.html -// [5]: http://www.gnu.org/software/bison/manual/html_node/Precedence-Only.html#Precedence-Only -// [6]: http://www.gnu.org/software/bison/manual/html_node/Token-Decl.html#Token-Decl -package y - -import ( - "bytes" - "fmt" - "go/ast" - "go/token" - "io" - "io/ioutil" - "sort" - "strconv" - "strings" - - yparser "github.com/cznic/parser/yacc" -) - -// Values of {AssocDef,Rule,Sym}.Associativity -const ( - AssocNotSpecified = iota - AssocLeft // %left - AssocRight // %right - AssocNone // %nonassoc - AssocPrecedence // %precedence -) - -// Action describes one cell of the parser table, ie. the action to be taken when -// the lookahead is Sym. -type Action struct { - Sym *Symbol - arg int -} - -// Kind returns typ: 'a' for accept, 's' for shift, 'r' for reduce and 'g' for goto. -// -// For 'a' arg is not used. -// For 's' arg is the state number to shift to. -// For 'r' arg is the rule number to reduce. -// For 'g' arg is the state number to goto. -func (a Action) Kind() (typ, arg int) { - if !a.Sym.IsTerminal { - return 'g', a.arg - } - - switch arg := a.arg; { - case arg < 0: - return 'r', -arg - case arg > 0: - return 's', arg - } - - return 'a', -1 -} - -// AssocDef describes one association definition of the .y source code. For -// example: -// -// %left '+', '-' -// %left '*', '/' -// -// The above will produce two items in Parser.AssocDefs with the particular -// values of the associativity and precendce recorded in the Associativity and -// Precedence fields of the respective Syms element. -type AssocDef struct { - Associativity int // One of the nonzero Assoc* constant values. - Syms []*Symbol // Symbols present for this association definition in the order of appearance. -} - -// Options amend the behavior of the various Process* functions. -// -// Error Examples -// -// Error examples implement the ideas in "Generating LR Syntax Error Messages -// from Examples"[1]. They extend the capability of a LALR parser to produce -// better error messages. -// -// XErrorSrc is a sequence of Go tokens separated by white space using the same -// rules as valid Go source code except that semicolon injection is not used. -// Comments of both short and long form are equal to white space. An example -// consists of an optional state set prefix followed by zero or more token -// specifiers followed by an error message. A state set is zero or more -// integer literals. Token specifier is a valid Go identifier or a Go -// character literal. The error message is a Go string literal. The EBNF is -// -// ErrorExamples = { { INT_LIT } { IDENTIFIER | CHAR_LIT } STRING_LIT } . -// -// The identifiers used in XErrorsSrc must be those defined as tokens in the -// yacc file. An implicit $end token is inserted at the end of the example -// input if no state set is given for that example. Examples with a state set -// are assumed to always specify the error-triggering lookahead token as the -// last example token, which is usually, but not necessarily the reserved -// error terminal symbol. If an example has a state set but no example tokens, -// a $end is used as an example. For example: -// -// /* -// Reject empty file -// */ -// /* $end inserted here*/ "invalid empty input" -// -// PACKAGE /* $end inserted here */ -// "Unexpected EOF" -// -// PACKAGE ';' /* $end inserted here even though parsing stops at ';' */ -// `Missing package name or newline after "package"` -// -// vs -// -// -// /* -// Reject empty file -// */ -// 0 -// /* $end inserted here */ "invalid empty input" -// -// 2 -// PACKAGE error /* no $end inserted here */ -// `Missing package name or newline after "package"` -// -// Other examples -// -// PACKAGE IDENT ';' -// IMPORT STRING_LIT ',' -// "multiple imports must be separated by semicolons" -// -// // Make the semicolon injection error a bit more user friendly. -// PACKAGE ';' -// `Missing package name or newline after "package"` -// -// // A calculator parser might have error examples like -// NUMBER '+' "operand expected" -// NUMBER '-' error "invalid operand for subtraction" -// -// Use a specific bad token to provide a specific message: -// -// // Coders frequently make this mistake. -// FOO BAR BAZ "baz cannot follow bar, only qux or frob can" -// -// Use the reserved error token to be less specific: -// -// // Catch any invalid token sequences after foo bar. -// FOO BAR error "bar must be followed by qux or frob" -// -// Terminate the token sequence to detect premature end of file: -// -// PACKAGE "missing package name" -// -// Similar to lex[3], examples sharing the same "action" can be joined by -// the | operator: -// -// CONST | -// FUNC | -// IMPORT | -// TYPE | -// VAR "package clause must be first" -// -// It's an error if the example token sequence is accepted by the parser, ie. -// if it does not produce an error. -// -// Note: In the case of example with a state set, the example tokens, except for -// the last one, serve only documentation purposes. Only the combination of a state and a particular -// lookahead is actually considered by the parser. -// -// Examples without a state set are processed differently and all the example -// tokens matter. An attempt is made to find the applicable state set -// automatically, but this computation is not yet completely functional and -// possibly only a subset of the real error states are produced. -type Options struct { - AllowConflicts bool // Do not report unresolved conflicts as errors. - AllowTypeErrors bool // Continue even if type checks fail. - Closures bool // Report non kernel items. - LA bool // Report all lookahead sets. - Report io.Writer // If non nil, write a grammar report to Report. - Resolved bool // Explain how conflicts were resolved. - Reducible bool // Check if all states are reducible. (Expensive) - XErrorsName string // Name used to report errors in XErrorsSrc, defaults to . - XErrorsSrc []byte // Used to produce errors by example[1]. - - debugSyms bool - - // In conflict with xerrors processing. - noDefault bool // Disable collapsing largest reduce lookahead set to $default. -} - -func (o *Options) boot(fset *token.FileSet) (*Options, error) { - if o == nil { - return &Options{}, nil - } - - p := *o - p.noDefault = true - return &p, nil -} - -// Parser describes the resulting parser. The intended client is a parser -// generator (like eg. [0]) producing the final Go source code. -type Parser struct { - AssocDefs []*AssocDef // %left, %right, %nonassoc definitions in the order of appearance in the source code. - ConflictsRR int // Number of reduce/reduce conflicts. - ConflictsSR int // Number of shift/reduce conflicts. - Definitions []*yparser.Definition // All definitions. - ErrorVerbose bool // %error-verbose is present. - LiteralStrings map[string]*Symbol // See Symbol.LiteralString field. - Prologue string // Collected prologue between the %{ and %} marks. - Rules []*Rule // Rules indexed by rule number. - Start string // Name of the start production. - States []*State // Parser states indexed by state number. - Syms map[string]*Symbol // Symbols indexed by name, eg. "IDENT", "Expression" or "';'". - Table [][]Action // Indexed by state number. - Tail string // Everyting after the second %%, if present. - Union *ast.StructType // %union as Go AST. - UnionSrc string // %union as Go source form. - XErrors []XError // Errors by example[1] descriptions. - y *y // -} - -func newParser() *Parser { - return &Parser{} -} - -func (p *Parser) parse(stopState int, lex func() *Symbol) (int, error) { - eof := p.Syms["$end"] - yystate := 0 - var yyS []int - var yychar *Symbol -stack: - for i := 0; i < 100; i++ { - if yystate == stopState { - return yystate, nil - } - - yyS = append(yyS, yystate) - if yychar == nil { - yychar = lex() - if yychar == nil { - yychar = eof - } - } - for _, act := range p.Table[yystate] { - if act.Sym != yychar { - continue - } - - switch typ, arg := act.Kind(); typ { - case 'a': - return yystate, nil - case 's': - yychar = nil - yystate = arg - case 'r': - rule := p.Rules[arg] - n := len(yyS) - m := len(rule.Components) - yyS = yyS[:n-m] - n -= m - tos := yyS[n-1] - yystate = p.States[tos].gotos[rule.Sym].arg - } - continue stack - } - return yystate, fmt.Errorf("no action for %s in state %d", yychar, yystate) - } - return yystate, fmt.Errorf("parser stall in state %d", yystate) -} - -// AcceptsEmptyInput returns whether the token string [$end] is accepted by the -// grammar. -func (p *Parser) AcceptsEmptyInput() bool { - toks, la := p.States[1].Syms0() - return len(toks) == 0 && la == p.y.endSym -} - -func (s *State) skeletonXErrors(y *y) (nonTerminals, terminals map[*Symbol]struct{}) { - for _, item := range s.kernel { - for { - sym := item.next(y) - if sym == nil || sym.IsTerminal { - break - } - - if sym.IsEmpty() { - item = newItem(item.rule(), item.dot()+1) - continue - } - - if nonTerminals == nil { - nonTerminals = map[*Symbol]struct{}{} - } - nonTerminals[sym] = struct{}{} - - if !sym.DerivesEmpty() { - break - } - - item = newItem(item.rule(), item.dot()+1) - } - } - for _, item := range s.xitems { - if sym := item.next(y); sym != nil && !sym.IsTerminal { - if nonTerminals == nil { - nonTerminals = map[*Symbol]struct{}{} - } - nonTerminals[sym] = struct{}{} - } - } - terminals = map[*Symbol]struct{}{} - for k := range s.actions { - if k == y.errSym { - return nil, nil - } - - terminals[k] = struct{}{} - } - return nonTerminals, terminals -} - -// SkeletonXErrors writes an automatically generated errors by example file to -// w. -func (p *Parser) SkeletonXErrors(w io.Writer) error { - if !p.AcceptsEmptyInput() { - if _, err := fmt.Fprintf(w, `/* - Reject empty input -*/ -0 -"invalid empty input" -`); err != nil { - return err - } - } - - type t struct { - states []int - syms []string - } - - errs := map[string]t{} - for _, state := range p.States { - nt, t := state.skeletonXErrors(p.y) - if nt == nil && t == nil { - continue - } - - var nta, ta []string - m := map[string]bool{} - for k := range nt { - nm := k.Name - if s := k.LiteralString; s != "" { - s2, err := strconv.Unquote(s) - if err != nil { - p.y.err(k.Pos, "unquote %s: %v", s, err) - } - nm = s2 - } - nm = strings.TrimSpace(nm) - if m[nm] { - continue - } - - m[nm] = true - nta = append(nta, nm) - } - - sort.Strings(nta) - for k := range t { - nm := k.Name - if s := k.LiteralString; s != "" { - s2, err := strconv.Unquote(s) - if err != nil { - p.y.err(k.Pos, "unquote %s: %v", s, err) - } - nm = s2 - } - nm = strings.TrimSpace(nm) - if m[nm] { - continue - } - - m[nm] = true - ta = append(ta, nm) - } - sort.Strings(ta) - - snt := strings.Join(nta, " or ") - if len(nta) != 0 { - snt += " or " - } - - st := strings.Join(ta, ", ") - if len(ta) > 1 { - st = "one of [" + st + "]" - } - - s := fmt.Sprintf("expected %s%s", snt, st) - v := errs[s] - v.states = append(v.states, state.id) - syms0, _ := state.Syms0() - syms := fmt.Sprintf("%v", syms0) - syms = syms[1 : len(syms)-1] - v.syms = append(v.syms, syms) - errs[s] = v - } - - var a []string - for k := range errs { - a = append(a, k) - } - sort.Strings(a) - - for _, msg := range a { - if _, err := fmt.Fprintln(w); err != nil { - return err - } - - v := errs[msg] - for i, state := range v.states { - syms := v.syms[i] - if syms != "" { - syms = " // " + syms - } - if _, err := fmt.Fprintf(w, "%d%s\n", state, syms); err != nil { - return err - } - } - if _, err := fmt.Fprintf(w, "error %q\n", msg); err != nil { - return err - } - } - return nil -} - -// Reductions returns a mapping rule# -> []state#. The slice is a sorted set of -// states in which the corresponding rule is reduced. -func (p *Parser) Reductions() map[int][]int { - m := map[int][]int{} - for state, actions := range p.Table { - for _, act := range actions { - if typ, arg := act.Kind(); typ == 'r' { - m[arg] = append(m[arg], state) - } - } - } - for k, v := range m { - sort.Ints(v) - m[k] = v - } - return m -} - -// ProcessAST processes yacc source code parsed in ast. It returns a *Parser or -// an error, if any. -func ProcessAST(fset *token.FileSet, ast *yparser.Specification, opts *Options) (*Parser, error) { - y, err := processAST(fset, ast, opts) - if y == nil { - return nil, err - } - - y.Parser.y = y - - for i, row := range y.Parser.Table { - sort.Sort(actions(row)) - y.Parser.Table[i] = row - } - return y.Parser, err -} - -// ProcessFile processes yacc source code in a named file. It returns a *Parser -// or an error, if any. -func ProcessFile(fset *token.FileSet, fname string, opts *Options) (*Parser, error) { - b, err := ioutil.ReadFile(fname) - if err != nil { - return nil, err - } - - return ProcessSource(fset, fname, b, opts) -} - -// ProcessSource processes yacc source code in src. It returns a *Parser or an -// error, if any. -func ProcessSource(fset *token.FileSet, fname string, src []byte, opts *Options) (*Parser, error) { - ast, err := yparser.Parse(fset, fname, src) - if err != nil { - return nil, err - } - - return ProcessAST(fset, ast, opts) -} - -// Rule describes a single yacc rule, for example (in source form) -// -// Start: -// Prologue Body Epilogue -// { -// $$ = &ast{$1, $2, $3} -// } -// -// Inner rule actions -// -// A rule can prescribe semantic actions not only at the end. For example -// -// Foo: -// Bar -// { -// initBar($1) -// } -// Qux -// { -// handleQux($3) -// } -// -// Such constructs are rewritten as -// -// $@1: -// { -// initBar($1) -// } -// -// Foo: -// Bar $@1 Qux -// { -// handleQux($3) -// } -// -// The $@1 and similar is a synthetic rule and such have non nil Parent. -// MaxParentDlr is used to check that the semantic action does not access -// parent values not yet shifted to the parse stack as well as to compute the -// position of the $n thing on the parse stack. See also [4]. -type Rule struct { - Action *yparser.Action // The semantic action associated with the rule, if any. If present then also the last element of Body. - Associativity int // One of the assoc* constants. - Body []interface{} // Rule components - int, string or *yparser.Action - Components []string // Textual forms of the rule components, for example []string{"IDENT", "';'"} - ExplicitPrecSym *Symbol // Symbol used in the optional %prec sym clause, if present. - MaxParentDlr int // See the Rule type docs for details. - Name *yparser.Token // The rule name token, if any (otherwise the rule starts with "|"). - Parent *Rule // Non nil if a synthetic rule. - PrecSym *Symbol // Effective %prec symbol used, if any. - Precedence int // -1 if no precedence assigned. - RuleNum int // Zero based rule number. Rule #0 is synthetic. - Sym *Symbol // LHS of the rule. - Token *yparser.Token // yparser.IDENT or "|" - maxDlr int - pos token.Pos - syms []*Symbol -} - -// Actions returns the textual representation of r.Actions combined. -func (r *Rule) Actions() string { - var buf bytes.Buffer - for _, v := range r.Action.Values { - switch v.Type { - case yparser.ActionValueDlrDlr: - buf.WriteString("$$") - case yparser.ActionValueDlrNum: - buf.WriteString(fmt.Sprintf("$%d", v.Num)) - case yparser.ActionValueDlrTagDlr: - buf.WriteString(fmt.Sprintf("$<%s>$", v.Tag)) - case yparser.ActionValueDlrTagNum: - buf.WriteString(fmt.Sprintf("$<%s>%d", v.Tag, v.Num)) - default: - buf.WriteString(v.Src) - } - } - return buf.String() -} - -// State represents one state of the parser. -type State struct { - actions map[*Symbol][]action // - distance int // On path to state 0. - gotos map[*Symbol]action // - id int // Numeric id of the state. - kernel itemSet // - lookahead []symSet // kernel LA. - parent *State // On path to state 0. - psym *Symbol // Label for the edge parent -> state. - resolved []string //TODO non string data. - sym *Symbol // Sym transfering from parent to state. - trans map[trans]stateItem // sym.i -> stateItem - xitems itemSet // {x ∈ closure(kernel) | x.rule -> ε }. - xla []symSet // xitems LA. - y *y // -} - -func newState(y *y, s itemSet) *State { - return &State{ - actions: map[*Symbol][]action{}, - gotos: map[*Symbol]action{}, - kernel: s, - lookahead: make([]symSet, len(s)), - trans: map[trans]stateItem{}, - y: y, - } -} - -func (s *State) zpath() []int { - if s == nil { - return nil - } - - return append(s.parent.zpath(), s.id) -} - -func (s *State) syms0() []*Symbol { - s.y.zeroPaths() - if s.parent == nil { - return nil - } - - sym := s.psym - if sym.IsTerminal { - return append(s.parent.syms0(), sym) - } - - return append(s.parent.syms0(), sym.MinString()...) -} - -// Syms0 returns an example of a string and a lookahead, if any, required to -// get to state s starting at state 0. If s is shifted into the lookahead is -// nil. -// -// Note: Invalid grammars and grammars with conflicts may have not all states -// reachable. -// -// To construct an example of a string for which the parser enters state s: -// -// syms, la := s.Syms0() -// if la != nil { -// syms = append(syms, la) -// } -// -func (s *State) Syms0() ([]*Symbol, *Symbol) { - str := s.syms0() - if s.parent == nil { - return str, nil - } - - if s.psym.IsTerminal { - return str, nil - } - - str0 := str - var a []string - for sym := range s.actions { - str = append(str0, sym) - if stop, _ := s.y.parse(s.id, func() *Symbol { - if len(str) == 0 { - return nil - } - - r := str[0] - str = str[1:] - return r - }); stop == s.id { - a = append(a, sym.Name) - } - } - if len(a) == 0 { - return str0, nil - } - - sort.Strings(a) - return str0, s.y.Syms[a[0]] -} - -// Reduce0 returns an example of a string required to reduce rule r in state s -// starting at state 0. If states s does not reduce rule r the string is empty. -// -// Note: Invalid grammars and grammars with conflicts may have not all states -// reachable and/or not all productions reducible. -func (s *State) Reduce0(r *Rule) []*Symbol { - rn := r.RuleNum - las := []string{} - for la, acts := range s.actions { - act := acts[0] - if act.kind == 'r' && act.arg == rn { - las = append(las, la.Name) - } - } - if len(las) == 0 { - return nil - } - - syms, _ := s.Syms0() - sort.Strings(las) - return append(syms, s.y.Syms[las[0]]) -} - -// A special default symbol has Name "$default" and represents the default -// action. - -// Symbol represents a terminal or non terminal symbol. A special end symbol -// has Name "$end" and represents the EOF token. -// -// LiteralString field -// -// Some parser generators accept an optional literal string token associated -// with a token definition. From [6]: -// -// You can associate a literal string token with a token type name by -// writing the literal string at the end of a %token declaration which -// declares the name. For example: -// -// %token arrow "=>" -// -// For example, a grammar for the C language might specify these names -// with equivalent literal string tokens: -// -// %token OR "||" -// %token LE 134 "<=" -// %left OR "<=" -// -// Once you equate the literal string and the token name, you can use them -// interchangeably in further declarations or the grammar rules. The yylex -// function can use the token name or the literal string to obtain the -// token type code number (see Calling Convention). Syntax error messages -// passed to yyerror from the parser will reference the literal string -// instead of the token name. -// -// The LiteralString captures the value of other definitions as well, namely -// also for %type definitions. -// -// %type CommaOpt "optional comma" -// -// %% -// -// CommaOpt: -// /* empty */ -// | ',' -type Symbol struct { - Associativity int // One of the assoc* constants. - ExplicitValue int // Explicit numeric value of the symbol or -1 if none. - IsLeftRecursive bool // S: S ... ; - IsRightRecursive bool // S: ... S ; - IsTerminal bool // Whether this is a terminal symbol. - LiteralString string // See the "LiteralString field" part of the Symbol godocs. - Name string // Textual value of the symbol, for example "IDENT" or "';'". - Pos token.Pos // Position where the symbol was firstly introduced. - Precedence int // -1 of no precedence assigned. - Rules []*Rule // Productions associated with this symbol. - Type string // For example "int", "float64" or "foo", but possibly also "". - Value int // Assigned numeric value of the symbol. - derivesE bool // Non terminal sym derives ε. - derivesEValid bool // - first1 symSet // - firstValid bool // - follow symSet // - id int // Index into y.syms - minStr []*Symbol // - minStrOk bool // -} - -// IsEmpty reports whether s derives only ε. -func (s *Symbol) IsEmpty() bool { - return len(s.Rules) == 1 && len(s.Rules[0].Components) == 0 -} - -func (s *Symbol) derivesEmpty(m map[*Symbol]bool) bool { - if m[s] { - return false - } - - m[s] = true - if s.IsTerminal { - return false - } - - if s.derivesEValid { - return s.derivesE - } - -nextRule: - for _, rule := range s.Rules { - if len(rule.Components) == 0 { - s.derivesE = true - s.derivesEValid = true - return true - } - - for _, sym := range rule.syms { - if !sym.derivesEmpty(m) { - continue nextRule - } - } - - s.derivesE = true - s.derivesEValid = true - return true - } - s.derivesE = false - s.derivesEValid = true - return false -} - -// DerivesEmpty returns whether s derives ε. -func (s *Symbol) DerivesEmpty() bool { - return s.derivesEmpty(map[*Symbol]bool{}) -} - -// - dragon 4.4 -// - http://www.cs.virginia.edu/~cs415/reading/FirstFollowLL.pdf -func (s *Symbol) first(y *y) (r symSet) { - if s.firstValid { - return s.first1 - } - - s.firstValid = true - r = y.newSymSet(-1) - for _, rule := range s.Rules { - if len(rule.Components) == 0 { - r.addEmpty() - break - } - } - s.first1 = r - defer func() { - s.first1 = r - }() - - if s.IsTerminal { - return y.newSymSet(s.id) - } - - if s == y.emptySym { - return y.newSymSet(s.id) - } - -nextRule: - for _, rule := range s.Rules { - for _, sym := range rule.syms { - t := sym.first(y) - r.add(t, false) - if !t.hasEmpty() { - continue nextRule - } - } - r.addEmpty() - } - return r -} - -// MinString returns an example of a string of symbols which can be reduced to -// s. If s is a terminal symbol the result is s. If the only way to express -// some non terminal s includes s itself then nil is returned (and the grammar -// is invalid). -func (s *Symbol) MinString() (r []*Symbol) { - r, _ = s.minString(nil) - return r -} - -func (s *Symbol) minString(m map[*Symbol]int) (r []*Symbol, ok bool) { - if str := s.minStr; str != nil { - return str, s.minStrOk - } - - defer func() { - s.minStr = r - s.minStrOk = ok - }() - - if s.IsTerminal { - return []*Symbol{s}, true - } - - if s.DerivesEmpty() { - return []*Symbol{}, true - } - - if m[s] != 0 { - return nil, false - } - - if m == nil { - m = map[*Symbol]int{} - } - m[s]++ - defer func() { m[s]-- }() - var best []*Symbol - var bestHasError bool -nextRule: - for _, rule := range s.Rules { - var current []*Symbol - hasError := false - for _, sym := range rule.syms { - if sym.Name == "error" { - hasError = true - } - str, ok := sym.minString(m) - if !ok { - continue nextRule - } - - current = append(current, str...) - } - ok = true - switch { - case best == nil: - best = current - bestHasError = hasError - case best != nil && bestHasError && !hasError: - best = current - bestHasError = false - case best != nil && !bestHasError && hasError: - // nop - case len(current) < len(best): - best = current - case len(current) == len(best): - for i, a := range current { - b := best[i] - if a.Name > b.Name { - break - } - if a.Name < b.Name { - best = current - break - } - } - } - } - return best, ok -} - -// String implements fmt.Stringer. -func (s *Symbol) String() string { - if s != nil { - return s.Name - } - - return "" -} - -// XError describes the parser state for an error by example. See [1]. -type XError struct { - Stack []int // Parser states stack, potentially partial, of the error event. TOS is Stack[len(Stack)-1]. - Lookahead *Symbol // Error lookahead symbol. Nil if LA is the reserved error symbol. - Msg string // Textual representation of the error condition. -} - -func (x *XError) mapKey() string { - return fmt.Sprintf("%v %v", x.Stack, x.Lookahead) -} diff --git a/vendor/github.com/cznic/y/y.go b/vendor/github.com/cznic/y/y.go deleted file mode 100644 index ab354cbb01b4f..0000000000000 --- a/vendor/github.com/cznic/y/y.go +++ /dev/null @@ -1,2199 +0,0 @@ -// Copyright 2014 The y Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package y - -import ( - "bytes" - "container/heap" - "fmt" - "go/ast" - "go/parser" - "go/scanner" - "go/token" - "io" - "sort" - "strconv" - "strings" - - "github.com/cznic/mathutil" - yparser "github.com/cznic/parser/yacc" - "github.com/cznic/strutil" -) - -const ( - intBits = mathutil.IntBits - bitShift = intBits>>6 + 5 - bitMask = intBits - 1 -) - -var ( - assocStr = map[int]string{ - AssocLeft: "%left", - AssocRight: "%right", - AssocNone: "%nonassoc", - AssocPrecedence: "%precedence", - } - empty = "ε" - isTesting bool -) - -type action struct { - kind int // 'a': accept, 'g': goto, 'r': reduce, 's': shift - arg int // a: N/A, r: rule#, g, s: state# -} - -type actions []Action - -func (a actions) Len() int { return len(a) } - -func (a actions) Less(i, j int) bool { - ni := a[i].Sym.Name - nj := a[j].Sym.Name - if ni < nj { - return true - } - - if ni > nj { - return false - } - - ti, ki := a[i].Kind() - tj, kj := a[i].Kind() - if ti < tj { - return true - } - - if ti > tj { - return false - } - - return ki < kj -} - -func (a actions) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -func newReduction(arg int) action { - if arg == 0 { - return action{'a', 0} - } - - return action{'r', arg} -} - -func (a action) String() string { - switch a.kind { - case 'a': - return "accept" - case 'g': - return fmt.Sprintf("goto state %d", a.arg) - case 'r': - return fmt.Sprintf("reduce using rule %d", a.arg) - case 's': - return fmt.Sprintf("shift, and goto state %d", a.arg) - default: - panic("y: internal error 008") - } -} - -type item uint64 // LR 0 item - -func newItem(rule, dot int) item { return item(uint64(rule)<<32 | uint64(dot)) } - -func (i item) dot() int { return int(i & (1<<32 - 1)) } - -func (i item) dump(y *y) string { - var buf bytes.Buffer - rule := y.Rules[i.rule()] - buf.WriteString(fmt.Sprintf("%3d %s:", i.rule(), rule.Sym.Name)) - dot := i.dot() - for _, v := range rule.Components[:dot] { - buf.WriteString(" " + v) - } - buf.WriteString(" .") - for _, v := range rule.Components[dot:] { - buf.WriteString(" " + v) - } - return buf.String() -} - -func (i item) next(y *y) *Symbol { return i.sym(y, i.dot()) } -func (i item) rule() int { return int(i >> 32) } - -func (i item) sym(y *y, dot int) *Symbol { - rule := y.Rules[i.rule()] - if dot < 0 { - return rule.Sym - } - - if dot == len(rule.Components) { - return nil - } - - return rule.syms[dot] -} - -func (i item) syms(y *y) (r []*Symbol) { - return y.Rules[i.rule()].syms -} - -type item1 struct { // LR 1 item - item item - sym *Symbol -} - -func (i item1) dump(y *y) string { - return fmt.Sprintf("%s, %s", i.item.dump(y), i.sym.Name) -} - -type itemSet []item - -func (s itemSet) add(i item) (itemSet, bool) { // true: s already has i - l, ok := s.find(i) - if ok { - return s, true - } - - s = append(s, 0) - copy(s[l+1:], s[l:]) - s[l] = i - return s, false -} - -func (s itemSet) clone() itemSet { return append(itemSet(nil), s...) } - -func (s itemSet) closure(y *y) (r itemSet) { // dragon 4.7, Fig. 4.33 - q, r := s.clone(), s.clone() - for len(q) != 0 { - item := q[len(q)-1] - q = q[:len(q)-1] - nx := item.next(y) - if nx == nil || nx.IsTerminal { - continue - } - - for _, rule := range nx.Rules { - s := newItem(rule.RuleNum, 0) - var ok bool - r, ok = r.add(s) - if !ok { - q = append(q, s) - } - } - } - return r -} - -func (s itemSet) find(i item) (m int, _ bool) { - l, h := 0, len(s)-1 - for l <= h { - m = (l + h) >> 1 - switch j := s[m]; { - case i > j: - l = m + 1 - case i == j: - return m, true - default: - h = m - 1 - } - } - return l, false -} - -func (s itemSet) goTo(y *y, x *Symbol) (r itemSet) { // dragon 4.7, Example 4.35. - if n := len(y.isPool); n != 0 { - r = y.isPool[n-1][:0] - y.isPool = y.isPool[:n-1] - } - for _, item := range s { //TODO cache item->nextSym - if item.next(y) != x { - continue - } - - r = append(r, item+1) - } - return r -} - -func (s itemSet) mustFind(i item) int { - if m, ok := s.find(i); ok { - return m - } - - panic("y: internal error 011") -} - -func (s itemSet) state(y *y) (int, bool) { - id := y.id(s) - n, ok := y.itemSets[id] - if !ok { - n = len(y.itemSets) - y.itemSets[id] = n - ns := newState(y, s) - ns.id = n - y.States = append(y.States, ns) - } - return n, ok -} - -type itemSet1 map[item1]bool - -func (s itemSet1) add(i item1) bool { // true: s already has i - if i.sym.id == 0 { - return true - } - - if _, ok := s[i]; ok { - return true - } - - s[i] = true - return false -} - -type stateItem struct { - state int - i int -} - -type symSet []int - -func (s symSet) add(t symSet, withEmpty bool) (r bool) { // true: s already has all items in t - r = true - for x, w := range t { - if x == 0 && !withEmpty { - w &^= 1 - } - if w == 0 { - continue - } - - o := s[x] - if w = o | w; w != o { - s[x] = w - r = false - } - } - return r -} - -func (s symSet) add1(t int) bool { // true: s already has t - x, m := t>>bitShift, 1<>1 { - if w&1 != 0 { - r++ - } - } - } - return r -} - -func (s symSet) dump(y *y) string { - var a []string - for x, w := range s { - for bit := 0; bit < intBits && w != 0; bit, w = bit+1, w>>1 { - if w&1 != 0 { - a = append(a, y.syms[x<>bitShift]&(1<>bitShift] &^= 1 << uint(t&bitMask) -} - -type trans struct { - item - *Symbol -} - -type typeDecl struct { - token.Pos - typeName string -} - -type percTypeLit struct { - pos token.Pos - lit string -} - -type y struct { - *Parser - acceptSym *Symbol // - allocVal int // - allocatedValues map[int]bool // - ast *yparser.Specification // - clsCache map[item]map[item]symSet // - clsQueue []item1 // Non reentrant item1.closure todo list. - clsSyms []*Symbol // Non reentrant item1.closure buffer. - dummySym *Symbol // - emptySym *Symbol // - endSym *Symbol // - entries int // Number of used cells in the parse table. - errSym *Symbol // - errors scanner.ErrorList // - firstRule int // - fset *token.FileSet // - idBuf []byte // Non reentrant id() buffer. - isPool []itemSet // - itemSets map[string]int // - noSym *Symbol // - nonTerminals map[string]token.Pos // - opts *Options // - percTypeLits map[string]*percTypeLit // nm: *percTypeLit - percTypeLitPos map[string]token.Pos // lit: *percTypeLit - precedence int // - ssPool []symSet // - symSetCap int // - symTypes map[string]typeDecl // - syms []*Symbol // - symsUsed map[string]token.Pos // - synthRule int // - types map[string]token.Pos // %union fields - typesUsed map[string]token.Pos // - unionPos token.Pos // - zeroPathsValid bool // States paths to state 0 determined. -} - -func newY(fset *token.FileSet, ast *yparser.Specification, opts *Options) *y { - r := &y{ - Parser: newParser(), - acceptSym: &Symbol{Name: "$accept"}, - allocatedValues: map[int]bool{}, - ast: ast, - clsCache: map[item]map[item]symSet{}, - dummySym: &Symbol{Name: "#", IsTerminal: true}, - emptySym: &Symbol{Name: empty, IsTerminal: true}, - endSym: &Symbol{Name: "$end", IsTerminal: true, Precedence: -1}, - errSym: &Symbol{Name: "error", IsTerminal: true}, - fset: fset, - idBuf: make([]byte, 1024), - itemSets: map[string]int{}, - noSym: &Symbol{Name: "$default", Value: -1}, - nonTerminals: map[string]token.Pos{}, - opts: opts, - percTypeLitPos: map[string]token.Pos{}, - percTypeLits: map[string]*percTypeLit{}, - types: map[string]token.Pos{}, - typesUsed: map[string]token.Pos{}, - } - r.symsUsed = map[string]token.Pos{r.errSym.Name: 0, r.noSym.Name: 0} - r.endSym.Value = r.allocValue() - r.errSym.Value = r.allocValue() - r.LiteralStrings = map[string]*Symbol{} - r.Syms = map[string]*Symbol{ - r.acceptSym.Name: r.acceptSym, - r.dummySym.Name: r.dummySym, - r.emptySym.Name: r.emptySym, - r.endSym.Name: r.endSym, - r.errSym.Name: r.errSym, - r.noSym.Name: r.noSym, - } - return r -} - -func processAST(fset *token.FileSet, ast *yparser.Specification, opts *Options) (*y, error) { - var err error - if opts, err = opts.boot(fset); err != nil { - return nil, err - } - - y := newY(fset, ast, opts) - if err := y.defs(); err != nil { - return nil, err - } - - if t := ast.Tail; t != nil { - y.Tail = t.Value - } - if err := y.rules0(); err != nil { - return nil, err - } - - m := map[int]*Symbol{} - a := make([]string, 0, len(y.Syms)) - for nm := range y.Syms { - a = append(a, nm) - } - sort.Strings(a) - for _, sym := range y.Syms { - nm := sym.Name - if v := sym.Value; v >= 0 { - ex := m[v] - if ex != nil && ex != sym { - y.err(sym.Pos, "symbol %s has the same value (%d) as symbol %s at %s.", sym, v, ex, y.pos(ex.Pos)) - continue - } - - if nm == "#" || nm == "ε" || nm == "$accept" { - continue - } - - m[v] = sym - } - } - for _, nm := range a { - sym := y.Syms[nm] - if nm == "" || nm == "ε" || nm == "#" || nm[0] == '$' && nm[1] != '@' && sym != y.noSym { // internal symbols - continue - } - - if sym.Value < 0 { - sym.Value = y.allocValue() - } - } - if err := y.error(); err != nil { - return nil, y.error() - } - - y.follows() - y.states0() - y.lookaheads() - y.reductions() - y.conflicts() - y.Table = make([][]Action, len(y.States)) - for i, state := range y.States { - a := make([]Action, 0, len(state.actions)+len(state.gotos)) - for sym, acts := range state.actions { - act := acts[0] - switch act.kind { - case 'a': - a = append(a, Action{y.endSym, 0}) - case 's': - a = append(a, Action{sym, act.arg}) - case 'r': - a = append(a, Action{sym, -act.arg}) - default: - panic("y: internal error 005") - } - } - for sym, act := range state.gotos { - a = append(a, Action{sym, act.arg}) - } - y.Table[i] = a - } - if w := opts.Report; w != nil { - y.report(w) - } - if y.opts.Reducible { - y.reducible() - } - return y, y.xerrors() -} - -func (y *y) addRule(r *Rule) *Rule { - r.Sym.Rules = append(r.Sym.Rules, r) - r.RuleNum = len(y.Rules) - y.Rules = append(y.Rules, r) - return r -} - -func (y *y) allocValue() (n int) { - for { - switch n = y.allocVal; { - case n == 0: - n = 0xe000 // Private Use Area. - case n == 0xf8ff: - n = 0xf0000 // Supplemental Private Use Area-A. - case n == 0xffffd: - n = 0x100000 // Supplemental Private Use Area-B. - case n == 0x10fffd: - panic("y: internal error 012") - default: - n++ - } - y.allocVal = n - if !y.allocatedValues[n] { - y.allocatedValues[n] = true - return n - } - } -} - -func (y *y) closure(i item) (r map[item]symSet) { // Result symSets must not be mutated. - if r, ok := y.clsCache[i]; ok { - return r - } - - r = y.closure0(map[item]symSet{i: y.newSymSet(y.dummySym.id)}, append(y.clsQueue[:0], item1{i, y.dummySym})) - y.clsCache[i] = r - return r -} - -func (y *y) closure0(j map[item]symSet, q []item1) map[item]symSet { // dragon 4.7, Fig. 4.38; not reentrant. - ySyms := y.clsSyms - for len(q) != 0 { - i := q[len(q)-1] - q = q[:len(q)-1] - bb := i.item.syms(y)[i.item.dot():] - if len(bb) == 0 { - continue - } - - rules := bb[0].Rules - ySyms = append(ySyms[:0], bb[1:]...) - ySyms = append(ySyms, i.sym) - symSet := y.first(ySyms) - for x, w := range symSet { - for bit := 0; bit < intBits && w != 0; bit, w = bit+1, w>>1 { - if w&1 == 0 { - continue - } - - for _, p := range rules { - nii := newItem(p.RuleNum, 0) - ni := item1{nii, y.syms[x< 1 { - panic("internal error") - } - - var in, out [][2]action - if len(s) != 0 { - s := s[0] - for _, r := range r { - in = append(in, [2]action{s, r}) - } - } - for i, r1 := range r { - for _, r2 := range r[i+1:] { - in = append(in, [2]action{r1, r2}) - } - } - for _, conflict := range in { - switch resolved, asShift := y.resolve(state, si, sym, conflict); { - case !resolved: - out = append(out, conflict) - case asShift: - if conflict[0].kind != 's' { - break - } - - r := conflict[1].arg - dot := len(y.Rules[r].Components) - item := newItem(r, dot) - switch dot { - case 0: - state.xla[state.xitems.mustFind(item)].remove(sym.id) - default: - state.lookahead[state.kernel.mustFind(item)].remove(sym.id) - } - } - } - ret := map[action]bool{} - var sr, rr bool - for _, conflict := range out { - ret[conflict[0]], ret[conflict[1]] = true, true - if conflict[0].kind == 's' { - sr = true - continue - } - - rr = true - } - if sr { - y.ConflictsSR++ - } - if rr { - y.ConflictsRR++ - } - var sa, ra []action - for action := range ret { - if action.kind == 's' { - sa = append(sa, action) - continue - } - - ra = append(ra, action) - } - state.actions[sym] = append(state.actions[sym], sa...) - state.actions[sym] = append(state.actions[sym], ra...) - } - sort.Strings(state.resolved) - } - if !y.opts.AllowConflicts { - if y.ConflictsSR != 0 { - y.err(0, "conflicts: %d shift/reduce", y.ConflictsSR) - } - if y.ConflictsRR != 0 { - y.err(0, "conflicts: %d reduce/reduce", y.ConflictsRR) - } - } - if y.opts.noDefault { - return y.error() - } - - for si, state := range y.States { - var valid bool - var la symSet - max := 0 - for i, item := range state.kernel { - if item.next(y) != nil || si == 1 && item == 1 { - continue - } - - if n := state.lookahead[i].len(); !valid || n < max { - max = n - la = state.lookahead[i] - valid = true - } - } - for i := range state.xitems { - if n := state.xla[i].len(); !valid || n < max { - max = n - la = state.xla[i] - valid = true - } - } - - if !valid { - continue - } - - // Collapse la reductions. - redn := -1 - for sym, actions := range state.actions { - action := actions[0] - if action.kind != 'r' { - continue - } - - if redn < 0 && la.has(sym.id) { - redn = action.arg - } - - switch actions = actions[1:]; len(actions) { - case 0: - delete(state.actions, sym) - default: - state.actions[sym] = actions - } - - } - state.actions[y.noSym] = []action{{'r', redn}} - } - return y.error() -} - -func (y *y) defs() error { - types := map[string]typeDecl{} - var buf bytes.Buffer - defer func() { - y.Prologue = buf.String() - y.symTypes = types - }() - - y.Definitions = y.ast.Defs - for _, def := range y.ast.Defs { - isAssoc := false - switch def.Case { - case 0: // START IDENTIFIER - nm := def.Token2.Val - y.Start = nm - y.nonTerminals[nm] = def.Token2.Pos() - y.useSym(nm, def.Token2.Pos()) - case 1: // UNION - if ex := y.unionPos; ex != 0 { - y.err(def.Token.Pos(), "duplicate %%union: previous at %v", y.pos(ex)) - break - } - - y.unionPos = def.Pos() - src := def.Value - for len(src) != 0 && src[0] != '{' { - src = src[1:] - } - if len(src) != 0 { - src = src[1:] - } - for len(src) != 0 && (src[0] == '\n' || src[0] == '\r') { - src = src[1:] - } - src = fmt.Sprintf("struct {\n\tyys int\n%s{}", src) - expr, err := parser.ParseExpr(src) - if err != nil { - y.err(def.Pos(), "invalid %%union:\n%s\n%v", src, err) - break - } - - y.Union, y.UnionSrc = expr.(*ast.CompositeLit).Type.(*ast.StructType), src[:len(src)-2] - for _, fields := range y.Union.Fields.List[1:] { - for _, nm := range fields.Names { - switch ex, ok := y.types[nm.Name]; { - case !ok: - y.types[nm.Name] = def.Pos() - default: - y.err(def.Pos(), "union field %s already declared: %s", nm, y.pos(ex)) - } - } - } - case 2: // LCURL RCURL - buf.WriteString(def.Value) - case 3: // ReservedWord Tag NameList - switch def.ReservedWord.Case { - case - 1, // LEFT - 2, // RIGHT - 3, // NONASSOC - 5: // PRECEDENCE - y.precedence++ - isAssoc = true - fallthrough - case 0: // TOKEN - var typ string - if tag := def.Tag; tag != nil { - typ = def.Tag.Token2.Val - y.useType(def.Tag.Token2.Pos(), typ) - } - assoc := AssocNotSpecified - switch def.ReservedWord.Token.Char.Rune { - case yparser.LEFT: - assoc = AssocLeft - case yparser.RIGHT: - assoc = AssocRight - case yparser.NONASSOC: - assoc = AssocNone - case yparser.PRECEDENCE: - assoc = AssocPrecedence - } - var assocDef AssocDef - assocDef.Associativity = assoc - for _, nmno := range def.Nlist { - var name string - num := nmno.Number - - switch x := nmno.Identifier.(type) { - case int: - name = fmt.Sprintf("%q", x) - if num < 0 { - num = x - } - case string: - name = x - default: - panic("internal error") - } - - t := &Symbol{ - Associativity: assoc, - ExplicitValue: num, - IsTerminal: true, - Name: name, - Pos: nmno.Token.Pos(), - Precedence: -1, - Type: typ, - Value: num, - } - ls := "" - if n := nmno.LiteralStringOpt; n != nil { - ls = n.Token.Val - if ex, ok := y.LiteralStrings[ls]; ok { - y.err(n.Token.Pos(), "literal strings must be unique, previous association with name at %v: %s", y.fset.Position(ex.Pos), ls) - } else { - y.LiteralStrings[ls] = t - y.percTypeLitPos[ls] = t.Pos - t.LiteralString = ls - } - } - if isAssoc { - assocDef.Syms = append(assocDef.Syms, t) - } - - switch def.ReservedWord.Token.Char.Rune { - case yparser.LEFT, yparser.RIGHT, yparser.NONASSOC, yparser.PRECEDENCE: - t.Precedence = y.precedence - } - - ex, ok := y.Syms[name] - if !ok { - if t.Value < 0 { - t.Value = y.allocValue() - } else { - y.allocatedValues[t.Value] = true - } - y.Syms[name] = t - continue - } - - // Merge the declarations, if possible. - if n := t.Associativity; n != AssocNotSpecified { - switch o := ex.Associativity; { - case o == AssocNotSpecified: - ex.Associativity = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous associativity declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - - if n := t.Precedence; n >= 0 { - switch o := ex.Precedence; { - case o < 0: - ex.Precedence = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous precedence declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - - if n := t.Type; n != "" { - switch o := ex.Type; { - case o == "": - ex.Type = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous type declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - - if n := t.Value; n >= 0 { - switch o := ex.Value; { - case o < 0: - ex.Value = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous value declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - } - if isAssoc { - y.AssocDefs = append(y.AssocDefs, &assocDef) - } - case 4: // TYPE - typ := "" - if tag := def.Tag; tag != nil { - typ = tag.Token2.Val - y.useType(def.Tag.Token2.Pos(), typ) - } - for _, nmno := range def.Nlist { - if x, ok := nmno.Identifier.(int); ok { - var name string - num := nmno.Number - - name = fmt.Sprintf("%q", x) - if num < 0 { - num = x - } - - t := &Symbol{ - Associativity: AssocNotSpecified, - ExplicitValue: num, - IsTerminal: true, - Name: name, - Pos: nmno.Token.Pos(), - Precedence: -1, - Type: typ, - Value: num, - } - ls := "" - if n := nmno.LiteralStringOpt; n != nil { - ls = n.Token.Val - if ex, ok := y.LiteralStrings[ls]; ok { - y.err(n.Token.Pos(), "literal strings must be unique, previous association with name at %v: %s", y.fset.Position(ex.Pos), ls) - } else { - y.LiteralStrings[ls] = t - y.percTypeLitPos[ls] = t.Pos - t.LiteralString = ls - } - } - ex, ok := y.Syms[name] - if !ok { - if t.Value < 0 { - t.Value = y.allocValue() - } else { - y.allocatedValues[t.Value] = true - } - y.Syms[name] = t - continue - } - - // Merge the declarations, if possible. - if n := t.Associativity; n != AssocNotSpecified { - switch o := ex.Associativity; { - case o == AssocNotSpecified: - ex.Associativity = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous associativity declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - - if n := t.Precedence; n >= 0 { - switch o := ex.Precedence; { - case o < 0: - ex.Precedence = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous precedence declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - - if n := t.Type; n != "" { - switch o := ex.Type; { - case o == "": - ex.Type = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous type declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - - if n := t.Value; n >= 0 { - switch o := ex.Value; { - case o < 0: - ex.Value = n - case n != o: - y.err( - t.Pos, - "%s: conflict with previous value declaration at %v", - name, y.pos(ex.Pos), - ) - } - } - continue - } - - nm := nmno.Identifier.(string) - if ex, ok := types[nm]; ok { - y.err(nmno.Token.Pos(), "%%type: previous declaration at %v", y.pos(ex.Pos)) - continue - } - - types[nm] = typeDecl{nmno.Token.Pos(), typ} - y.useSym(nm, nmno.Token.Pos()) - ls := "" - if n := nmno.LiteralStringOpt; n != nil { - ls = n.Token.Val - y.percTypeLits[nm] = &percTypeLit{nmno.Token.Pos(), ls} - if ex, ok := y.percTypeLitPos[ls]; ok { - y.err(n.Token.Pos(), "literal strings must be unique, previous association with name at %v: %s", y.fset.Position(ex), ls) - } else { - y.percTypeLitPos[ls] = nmno.Token.Pos() - } - } - } - default: - panic("internal error") - } - case 4: // ReservedWord Tag (No NameList) - case 5: // ERROR_VERBOSE - y.ErrorVerbose = true - default: - fmt.Println(def.Case) - panic("internal error") - } - } - return y.error() -} - -func (y *y) err(pos token.Pos, format string, arg ...interface{}) error { - return y.errp(y.pos(pos), format, arg...) -} - -func (y *y) errp(pos token.Position, format string, arg ...interface{}) error { - y.errors.Add(pos, fmt.Sprintf(format, arg...)) - return y.errors[len(y.errors)-1] -} - -func (y *y) error() error { - if len(y.errors) == 0 { - return nil - } - - y.errors.Sort() - return y.errors.Err() -} - -func (y *y) first(x []*Symbol) (r symSet) { // dragon, 4.4 - r = y.newSymSet(-1) - for _, sym := range x { - f1 := sym.first(y) - r.add(f1, false) - if !f1.hasEmpty() { - return r - } - } - - r.addEmpty() - return r -} - -func (y *y) follows() { // dragon, 4.4 - y.acceptSym.follow = y.newSymSet(y.endSym.id) // 1. - for { - changed := false - - for _, sym := range y.Syms { - if sym.IsTerminal { - continue - } - - for _, rule := range sym.Rules { - a := rule.Sym - if len(a.follow) == 0 { - a.follow = y.newSymSet(-1) - } - syms := rule.syms - n := len(syms) - for dot, b := range syms { - if len(b.follow) == 0 { - b.follow = y.newSymSet(-1) - } - f3 := false - if dot < n-1 { // 2. - beta := syms[dot+1] - f := beta.first(y) - if !b.follow.add(f, false) { - changed = true - } - f3 = f.hasEmpty() - } - if dot == n-1 || f3 { // 3. - if !b.follow.add(a.follow, true) { - changed = true - } - } - } - } - } - - if !changed { - break - } - } -} - -func (y *y) id(s itemSet) string { // Not reentrant. - b := y.idBuf[:0] //TODO try compute size in advance using log2 - for _, item := range s { - r, d := item.rule(), item.dot() - if r != 0 && d == 0 { - continue - } - - for r != 0 { - b = append(b, byte(r)&0x7f) - r >>= 7 - } - b = append(b, 0x80) - for d != 0 { - b = append(b, byte(d)&0x7f) - d >>= 7 - } - b = append(b, 0x81) - } - y.idBuf = b - return string(b) -} - -func (y *y) lookaheads() { - di := y.dummySym.id - dx, dm := di>>bitShift, 1<= 0 { - r[sym>>bitShift] = 1 << uint(sym&bitMask) - } - return r -} - -func (y *y) pos(po token.Pos) token.Position { return y.fset.Position(po) } - -func (y *y) reducible() error { - for si, state := range y.States { - for _, actions := range state.actions { - action := actions[0] - if action.kind != 'r' { - continue - } - - rule := y.Rules[action.arg] - if len(state.Reduce0(rule)) == 0 { - y.errp(y.pos(rule.Sym.Pos), "no token string reduces %s in state %d", rule.Sym, si) - } - } - } - return y.error() -} - -func (y *y) reductions() { - defaultLA := y.newSymSet(y.noSym.id) - for _, state := range y.States { - for i, item := range state.kernel { - if item.next(y) != nil { - continue - } - - // Item reduces a rule. - la := state.lookahead[i] - if len(la) == 0 { - la = defaultLA - } - for x, w := range la { - for bit := 0; bit < intBits && w != 0; bit, w = bit+1, w>>1 { - if w&1 == 0 { - continue - } - - sym := y.syms[x<>1 { - if w&1 == 0 { - continue - } - - sym := y.syms[x<") - case !s.IsTerminal: - f.Format(" <%s>", s) - default: - f.Format(" %s", s) - } - } - if la != nil { - f.Format(" [%s]", la) - } - f.Format("%i\n\n") - - switch { - case y.opts.Closures: - for _, item := range state.kernel.closure(y) { - rule := y.Rules[item.rule()] - f.Format("%v", item.dump(y)) - if y.opts.LA || item.next(y) == nil { - switch i, ok := state.kernel.find(item); { - case ok: - f.Format(" [%s]", state.lookahead[i].dump(y)) - default: - if i, ok := state.xitems.find(item); ok { - f.Format(" [%s]", state.xla[i].dump(y)) - } - } - } - if as := assocStr[rule.Associativity]; as != "" || rule.Precedence >= 0 { - f.Format(" // assoc %s, prec %d", as, rule.Precedence) - } - f.Format("\n") - } - default: - for i, item := range state.kernel { - rule := y.Rules[item.rule()] - f.Format("%v", item.dump(y)) - if y.opts.LA || item.dot() == len(rule.Components) { - f.Format(" [%s]", state.lookahead[i].dump(y)) - } - if as := assocStr[rule.Associativity]; as != "" || rule.Precedence >= 0 { - f.Format(" // assoc %s, prec %d", as, rule.Precedence) - } - f.Format("\n") - } - for i, item := range state.xitems { - rule := y.Rules[item.rule()] - f.Format("%v [%s]", item.dump(y), state.xla[i].dump(y)) - if as := assocStr[rule.Associativity]; as != "" || rule.Precedence >= 0 { - f.Format(" // assoc %s, prec %d", as, rule.Precedence) - } - f.Format("\n") - } - } - - f.Format("%i\n") - a := []string{} - var w int - for sym := range state.actions { - w = mathutil.Max(w, len(sym.Name)) - a = append(a, sym.Name) - } - sort.Strings(a) - type conflict struct { - sym *Symbol - acts []action - } - var conflicts []conflict - for _, nm := range a { - sym := y.Syms[nm] - acts := state.actions[sym] - act := acts[0] - f.Format("%-*s %v", w, nm, act) - if act.kind == 'r' { - f.Format(" (%s)", y.Rules[act.arg].Sym.Name) - } - if len(acts) > 1 { - conflicts = append(conflicts, conflict{sym, acts}) - } - f.Format("\n") - } - a = a[:0] - w = 0 - for sym := range state.gotos { - w = mathutil.Max(w, len(sym.Name)) - a = append(a, sym.Name) - } - sort.Strings(a) - for i, nm := range a { - if i == 0 { - f.Format("\n") - } - f.Format("%-*s %v\n", w, nm, state.gotos[y.Syms[nm]]) - } - for i, conflict := range conflicts { - if i == 0 { - if len(state.gotos) != 0 { - f.Format("\n") - } - } - sym := conflict.sym - nm := sym.Name - f.Format("conflict on %v", nm) - for _, act := range conflict.acts { - f.Format(", %s", act.String()) - } - if as := assocStr[sym.Associativity]; as != "" || sym.Precedence >= 0 { - f.Format(" // %v: assoc %s, prec %d", nm, assocStr[sym.Associativity], sym.Precedence) - } - f.Format("\n") - } - if len(state.resolved) != 0 { - f.Format("\n") - } - for _, v := range state.resolved { - f.Format("%s\n", v) - } - f.Format("%u%u\n") - } -} - -func (y *y) resolve(s *State, si int, sym *Symbol, conflict [2]action) (resolved, asShift bool) { - switch conflict[0].kind { - case 's': - rrule := y.Rules[conflict[1].arg] - sprec, rprec := sym.Precedence, rrule.Precedence - if sprec < 0 || rprec < 0 { - break - } - - var explain string - defer func() { - if y.opts.Resolved && resolved { - s.resolved = append(s.resolved, explain) - } - }() - - switch { - case sprec > rprec: - explain = fmt.Sprintf( - "Conflict between rule %d and token %s resolved as shift (%s < %s).", - rrule.RuleNum, sym, rrule.PrecSym, sym, - ) - s.actions[sym] = append(s.actions[sym], conflict[0]) - return true, true - case sprec < rprec: - explain = fmt.Sprintf( - "Conflict between rule %d and token %s resolved as reduce (%s < %s).", - rrule.RuleNum, sym, sym, rrule.PrecSym, - ) - s.actions[sym] = append(s.actions[sym], conflict[1]) - return true, false - case sym.Associativity == AssocLeft: - explain = fmt.Sprintf( - "Conflict between rule %d and token %s resolved as reduce (%%left %s).", - rrule.RuleNum, sym, sym, - ) - s.actions[sym] = append(s.actions[sym], conflict[1]) - return true, false - case sym.Associativity == AssocRight: - explain = fmt.Sprintf( - "Conflict between rule %d and token %s resolved as shift (%%right %s).", - rrule.RuleNum, sym, sym, - ) - s.actions[sym] = append(s.actions[sym], conflict[0]) - return true, true - case sym.Associativity == AssocNone: - y.err(sym.Pos, "%nonassoc symbol %s conflict in state %d", sym, si) - } - case 'r': - // nop - default: - panic("y: internal error 009") - } - return false, false -} - -func (y *y) litSym(s string) string { - if s[0] != '"' { - return s - } - - x := y.LiteralStrings[s] - if x == nil { - return s - } - - return x.Name -} - -func (y *y) rules0() error { - y.addRule(&Rule{ - Components: []string{""}, - Precedence: -1, - Sym: y.acceptSym, - }) - post := map[string]token.Pos{} - - for _, prule := range y.ast.Rules { - nm := prule.Name.Val - if nm == "error" { - y.err(prule.Name.Pos(), "a rule cannot use the reserved name error") - continue - } - - ruleSym := y.Syms[nm] - if ruleSym == nil { - ruleSym = &Symbol{Name: nm, Pos: prule.Name.Pos(), Value: -1} - y.Syms[nm] = ruleSym - } - lit := y.percTypeLits[nm] - if lit != nil { - ls := lit.lit - y.LiteralStrings[ls] = ruleSym - ruleSym.LiteralString = ls - } - ruleSym.Type = y.symTypes[ruleSym.Name].typeName - r := &Rule{ - Body: prule.Body, - MaxParentDlr: -1, - Precedence: -1, - Sym: ruleSym, - Token: prule.Token, - pos: prule.Name.Pos(), - } - if prule.Case == 0 { - r.Name = prule.Name - } - - // Make $n have index n. - pcomponents := append([]interface{}{nil}, prule.Body...) - if pr := prule.Precedence; pr != nil { - for pr != nil && pr.Case == 3 { // Precedence ';' - pr = pr.Precedence - } - - if pr != nil { - var nm string - switch x := pr.Identifier.(type) { - case int: - nm = fmt.Sprintf("%q", x) - case string: - nm = y.litSym(x) - default: - panic("internal error") - } - - s, ok := y.Syms[nm] - if !ok { - y.err(pr.Token2.Pos(), "%%prec: undefined symbol (1) %s", nm) //TODO -(1) - continue - } - - if !s.IsTerminal { - y.err(pr.Token2.Pos(), "must be a terminal: %s", nm) - continue - } - - r.Associativity, r.Precedence = s.Associativity, s.Precedence - r.PrecSym = s - r.ExplicitPrecSym = s - } - } - - var finalAct *yparser.Action - var components []string - for i, item := range pcomponents { - switch x := item.(type) { - case nil: - // no $0 component - case string: - x = y.litSym(x) - y.useSym(x, prule.Name.Pos()) - if len(components) == 0 && x == r.Sym.Name { - r.Sym.IsLeftRecursive = true - } - components = append(components, x) - sym := y.Syms[x] - if sym == nil || sym.Type != "" { - break - } - - sym.Type = y.symTypes[x].typeName - case *yparser.Action: - for _, v := range x.Values { - n := v.Num - tag := v.Tag - if v.Type == yparser.ActionValueDlrDlr && ruleSym.Type == "" && !y.opts.AllowTypeErrors { - y.err(v.Pos, "$$ of %s has no declared type", ruleSym) - } - if v.Type == yparser.ActionValueDlrNum || v.Type == yparser.ActionValueDlrTagNum { - switch { - case n < 1 || n >= len(pcomponents): - y.err(v.Pos, "undefined: $%d", n) - case n >= i: - y.err(v.Pos, "not accessible here: $%d", n) - case v.Type == yparser.ActionValueDlrNum: - csym := components[n-1] - if _, ok := post[csym]; !ok { - post[csym] = v.Pos - } - } - } - if v.Type == yparser.ActionValueDlrTagDlr || v.Type == yparser.ActionValueDlrTagNum { - switch _, ok := y.types[tag]; { - case ok: - y.useType(v.Pos, tag) - default: - y.err(v.Pos, "undefined type %s", tag) - } - } - } - - if i == len(pcomponents)-1 { - finalAct = x - break - } - - y.synthRule++ - s := &Symbol{Name: fmt.Sprintf("$@%d", y.synthRule), Value: -1} - y.Syms[s.Name] = s - y.addRule(&Rule{ - Action: x, - MaxParentDlr: i - 1, - Parent: r, - Sym: s, - maxDlr: -1, - Precedence: -1, - }) - components = append(components, s.Name) - case int: // literal - nm := fmt.Sprintf("%q", x) - components = append(components, nm) - pcomponents[i] = nm - s := y.Syms[nm] - if s != nil { - break - } - - s = &Symbol{Name: nm, IsTerminal: true, Precedence: -1, Value: x} - y.Syms[nm] = s - default: - panic("internal error") - } - } - r.Action = finalAct - r.maxDlr = len(pcomponents) - 1 - r.Components = components - if len(components) != 0 && components[len(components)-1] == r.Sym.Name { - r.Sym.IsRightRecursive = true - } - y.addRule(r) - if r.Sym.Type != "" && r.Action == nil && len(components) == 0 { - y.err(prule.Token.Pos(), "empty rule for typed nonterminal, and no action") - } - - if y.firstRule == 0 { - y.firstRule = r.RuleNum - } - } - - if y.Start == "" { - y.Start = y.Rules[y.firstRule].Sym.Name - } - y.useSym(y.Start, y.ast.Rules[0].Token.Pos()) - y.Rules[0].Components[0] = y.Start - - for _, rule := range y.Rules { - if rule.Precedence >= 0 { - continue - } - - components := rule.Components - if len(components) == 0 { - rule.Sym.derivesE = true - rule.Sym.derivesEValid = true - continue - } - - for i := len(components) - 1; i >= 0; i-- { - if sym := y.Syms[components[i]]; sym != nil && sym.IsTerminal { - rule.Associativity, rule.Precedence = sym.Associativity, sym.Precedence - rule.PrecSym = sym - break - } - } - } - - for nm, pos := range y.typesUsed { - if _, ok := y.types[nm]; !ok { - y.err(pos, "undefined type %s", nm) - } - } - - for nm, pos := range post { - sym := y.Syms[nm] - if (sym == nil || sym.Type == "") && !y.opts.AllowTypeErrors { - y.err(pos, "%s has no declared type", nm) - } - } - - //TODO for nm, pos := range y.types { - //TODO if _, ok := y.typesUsed[nm]; !ok { - //TODO y.err(pos, "type declared and not used: %s", nm) - //TODO } - //TODO } - - for nm, pos := range y.symsUsed { - if _, ok := y.Syms[nm]; !ok { - y.err(pos, "undefined symbol %s", nm) - } - } - - y.syms = make([]*Symbol, len(y.Syms)) - y.syms[0] = y.emptySym - x := 1 - a := make([]string, 0, len(y.Syms)) - for nm := range y.Syms { - a = append(a, nm) - } - sort.Strings(a) - for _, nm := range a { - s := y.Syms[nm] - if s != y.emptySym { - s.id = x - y.syms[x] = s - x++ - } - if nm[0] == '$' || s.IsTerminal { - continue - } - - if _, ok := y.symsUsed[nm]; !ok { - y.err(s.Pos, "non terminal declared and not used: %s", nm) - } - } - y.symSetCap = (len(y.syms) + intBits - 1) / intBits - for nm := range y.nonTerminals { - nt, ok := y.Syms[nm] - if !ok { - continue - } - - if nt.IsTerminal { - y.err(nt.Pos, "expected %s to be a non terminal", nt) - } - - } - - for _, rule := range y.Rules { - rule.syms = make([]*Symbol, len(rule.Components)) - for i, v := range rule.Components { - rule.syms[i] = y.Syms[v] - } - if y.opts.AllowTypeErrors { - continue - } - - if e := rule.Sym.Type; e != "" && rule.Action == nil && len(rule.Components) != 0 { - if g := y.Syms[rule.Components[0]].Type; g != e { - y.err(rule.pos, "type clash on default action: <%s> != <%s>", e, g) - } - } - } - return y.error() -} - -func (y *y) states0() { - itemSet{0}.state(y) - syms := y.newSymSet(-1) - q := []int{0} - for len(q) != 0 { - s := q[len(q)-1] - state := y.States[s] - q = q[:len(q)-1] - cls := state.kernel.closure(y) - syms.clear() - for _, item := range cls { - sym := item.next(y) - if sym == nil { // reduction - if len(item.syms(y)) == 0 { // rule -> ε - state.xitems = append(state.xitems, item) - } - continue - } - - goTo := cls.goTo(y, sym) - n, ok := goTo.state(y) - if !ok { - q = append(q, n) - } else { - y.isPool = append(y.isPool, goTo) - } - - state.trans[trans{item, sym}] = stateItem{n, goTo.mustFind(item + 1)} - if syms.add1(sym.id) { - continue - } - - switch { - case sym.IsTerminal: - state.actions[sym] = append(state.actions[sym], action{'s', n}) - default: - state.gotos[sym] = action{'g', n} - } - } - y.entries += len(state.actions) + len(state.gotos) - state.xla = make([]symSet, len(state.xitems)) - } -} - -func (y *y) useSym(nm string, pos token.Pos) { - if _, ok := y.symsUsed[nm]; ok { - return - } - - y.symsUsed[nm] = pos -} - -func (y *y) useType(pos token.Pos, name string) { - if name == "" { - return - } - - if _, ok := y.typesUsed[name]; ok { - return - } - - y.typesUsed[name] = pos -} - -func (y *y) xerrors() error { - n := len(y.opts.XErrorsSrc) - if n == 0 { - return y.error() - } - - if y.opts.XErrorsName == "" { - y.opts.XErrorsName = "" - } - var s scanner.Scanner - s.Init( - y.fset.AddFile(y.opts.XErrorsName, -1, n), - y.opts.XErrorsSrc, - func(pos token.Position, msg string) { - y.errp(pos, msg) - }, - 0, // Ignore comments - ) - - var stateSet []int - var stateSets [][]int - var example []string - var examples [][]string - m := map[string]string{} - var list []XError - acceptInt := true -examples: - for { - switch pos, tok, lit := s.Scan(); tok { - case token.INT: - if !acceptInt { - y.err(pos, "state number not accepted here") - break - } - - n, err := strconv.ParseUint(lit, 10, 31) - if err != nil { - y.err(pos, "%v", err) - break - } - - stateSet = append(stateSet, int(n)) - case token.IDENT: - acceptInt = false - sym, ok := y.Syms[lit] - if !ok { - y.err(pos, "undefined symbol %s", lit) - break - } - - if !sym.IsTerminal { - y.err(pos, "not a terminal symbol: %s", lit) - break - } - - if lit == "error" { - lit = "" - } - example = append(example, lit) - case token.CHAR: - acceptInt = false - t, err := strconv.Unquote(lit) - if err != nil { - y.err(pos, "%v", err) - break - } - - nm := fmt.Sprintf("%q", []rune(t)[0]) - if _, ok := y.Syms[nm]; !ok { - y.Syms[nm] = &Symbol{Name: nm, IsTerminal: true, Precedence: -1, Value: int([]rune(lit)[0])} - } - example = append(example, nm) - case token.OR: // '|' - stateSets = append(stateSets, stateSet) - stateSet = nil - examples = append(examples, example) - example = nil - case token.STRING: - acceptInt = true - parse := func(toks []string) (stack []int, la *Symbol, ok bool) { - lex := func() *Symbol { - if la != nil { - return la - } - - if len(toks) == 0 { - la = y.endSym - return la - } - - la = y.Syms[toks[0]] - toks = toks[1:] - return la - } - - stack = []int{0} - for { - state := y.States[stack[len(stack)-1]] - tok := lex() - var action action - actions, ok := state.actions[tok] - if !ok { - return stack, la, true - } - - action = actions[0] - switch action.kind { - case 'a': - return stack, la, false - case 's': - la = nil - stack = append(stack, action.arg) - case 'r': - rule := y.Rules[action.arg] - stack = stack[:len(stack)-len(rule.Components)] - stack = append(stack, y.States[stack[len(stack)-1]].gotos[rule.Sym].arg) - default: - panic("y: internal error 010") - } - } - } - lit := lit[1 : len(lit)-1] - stateSets = append(stateSets, stateSet) - for i, example := range append(examples, example) { - stateSet := stateSets[i] - if len(stateSet) != 0 { - if len(example) == 0 { - example = []string{"$end"} - } - - last := example[len(example)-1] - la := y.Syms[last] - for _, state := range stateSet { - xe := XError{[]int{state}, la, lit} - list = append(list, xe) - m[xe.mapKey()] = lit - } - continue - } - - stack, la, ok := parse(example) - if !ok { - y.err(pos, "parser unexpectedly accepts xerror example: %v %s", example, lit) - continue - } - - xe := XError{stack, la, lit} - list = append(list, xe) - m[xe.mapKey()] = lit - } - example = example[:0] - examples = examples[:0] - stateSet = stateSet[:0] - stateSets = stateSets[:0] - case token.EOF: - break examples - case token.ILLEGAL: - y.err(pos, "illegal token %s (%q)", tok, lit) - break examples - case token.SEMICOLON: - if lit == "\n" { - break - } - - fallthrough - default: - y.err(pos, "unexpected token %s (%q)", tok, lit) - break examples - } - } - for _, v := range list { - if m[v.mapKey()] == v.Msg { - y.XErrors = append(y.XErrors, v) - } - } - return y.error() -} - -func (y *y) zeroPaths() { - if y.zeroPathsValid { - return - } - - var h zpHeap - s0 := y.States[0] - m := make([]bool, len(y.States)) - h.add(y, s0) - m[0] = true - for n := len(y.States) - 1; n != 0 && h.Len() != 0; { - e := heap.Pop(&h).(*zpElem) - d := e.dest - if d.psym == nil { - d.parent = e.src - d.psym = e.sym - d.distance = e.distance - n-- - } - if di := d.id; !m[di] { - m[di] = true - h.add(y, d) - } - } - y.zeroPathsValid = true -} - -type zpElem struct { - src, dest *State - sym *Symbol - distance int -} - -func (z *zpElem) less(b *zpElem) bool { - if z.distance < b.distance { - return true - } - - if z.distance > b.distance { - return false - } - - if z.sym.Name < b.sym.Name { - return true - } - - if z.sym.Name > b.sym.Name { - return false - } - - return z.src.id < z.dest.id -} - -type zpHeap []*zpElem - -func (z zpHeap) Len() int { return len(z) } -func (z zpHeap) Less(i, j int) bool { return z[i].less(z[j]) } -func (z zpHeap) Swap(i, j int) { z[i], z[j] = z[j], z[i] } -func (z *zpHeap) Push(x interface{}) { *z = append(*z, x.(*zpElem)) } - -func (z *zpHeap) Pop() interface{} { - s := *z - r := s[len(s)-1] - *z = s[:len(s)-1] - return r -} - -func (z *zpHeap) add(y *y, s *State) { - var a []string - for sym := range s.actions { - a = append(a, sym.Name) - } - sort.Strings(a) - for _, nm := range a { - sym := y.Syms[nm] - actions := s.actions[sym] - action := actions[0] - if action.kind == 's' { - heap.Push(z, &zpElem{s, y.States[action.arg], sym, s.distance + len(sym.MinString())}) - } - } - a = a[:0] - for sym := range s.gotos { - a = append(a, sym.Name) - } - sort.Strings(a) - for _, nm := range a { - sym := y.Syms[nm] - action := s.gotos[sym] - heap.Push(z, &zpElem{s, y.States[action.arg], sym, s.distance + len(sym.MinString())}) - } -} diff --git a/vendor/github.com/pingcap/errors/LICENSE b/vendor/github.com/pingcap/errors/LICENSE new file mode 100644 index 0000000000000..835ba3e755cef --- /dev/null +++ b/vendor/github.com/pingcap/errors/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2015, Dave Cheney +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pingcap/errors/errors.go b/vendor/github.com/pingcap/errors/errors.go new file mode 100644 index 0000000000000..2e1d3f6289668 --- /dev/null +++ b/vendor/github.com/pingcap/errors/errors.go @@ -0,0 +1,324 @@ +// Package errors provides simple error handling primitives. +// +// The traditional error handling idiom in Go is roughly akin to +// +// if err != nil { +// return err +// } +// +// which applied recursively up the call stack results in error reports +// without context or debugging information. The errors package allows +// programmers to add context to the failure path in their code in a way +// that does not destroy the original value of the error. +// +// Adding context to an error +// +// The errors.Annotate function returns a new error that adds context to the +// original error by recording a stack trace at the point Annotate is called, +// and the supplied message. For example +// +// _, err := ioutil.ReadAll(r) +// if err != nil { +// return errors.Annotate(err, "read failed") +// } +// +// If additional control is required the errors.AddStack and errors.WithMessage +// functions destructure errors.Annotate into its component operations of annotating +// an error with a stack trace and an a message, respectively. +// +// Retrieving the cause of an error +// +// Using errors.Annotate constructs a stack of errors, adding context to the +// preceding error. Depending on the nature of the error it may be necessary +// to reverse the operation of errors.Annotate to retrieve the original error +// for inspection. Any error value which implements this interface +// +// type causer interface { +// Cause() error +// } +// +// can be inspected by errors.Cause. errors.Cause will recursively retrieve +// the topmost error which does not implement causer, which is assumed to be +// the original cause. For example: +// +// switch err := errors.Cause(err).(type) { +// case *MyError: +// // handle specifically +// default: +// // unknown error +// } +// +// causer interface is not exported by this package, but is considered a part +// of stable public API. +// errors.Unwrap is also available: this will retrieve the next error in the chain. +// +// Formatted printing of errors +// +// All error values returned from this package implement fmt.Formatter and can +// be formatted by the fmt package. The following verbs are supported +// +// %s print the error. If the error has a Cause it will be +// printed recursively +// %v see %s +// %+v extended format. Each Frame of the error's StackTrace will +// be printed in detail. +// +// Retrieving the stack trace of an error or wrapper +// +// New, Errorf, Annotate, and Annotatef record a stack trace at the point they are invoked. +// This information can be retrieved with the StackTracer interface that returns +// a StackTrace. Where errors.StackTrace is defined as +// +// type StackTrace []Frame +// +// The Frame type represents a call site in the stack trace. Frame supports +// the fmt.Formatter interface that can be used for printing information about +// the stack trace of this error. For example: +// +// if stacked := errors.GetStackTracer(err); stacked != nil { +// for _, f := range stacked.StackTrace() { +// fmt.Printf("%+s:%d", f) +// } +// } +// +// See the documentation for Frame.Format for more details. +// +// errors.Find can be used to search for an error in the error chain. +package errors + +import ( + "fmt" + "io" +) + +// New returns an error with the supplied message. +// New also records the stack trace at the point it was called. +func New(message string) error { + return &fundamental{ + msg: message, + stack: callers(), + } +} + +// Errorf formats according to a format specifier and returns the string +// as a value that satisfies error. +// Errorf also records the stack trace at the point it was called. +func Errorf(format string, args ...interface{}) error { + return &fundamental{ + msg: fmt.Sprintf(format, args...), + stack: callers(), + } +} + +// StackTraceAware is an optimization to avoid repetitive traversals of an error chain. +// HasStack checks for this marker first. +// Annotate/Wrap and Annotatef/Wrapf will produce this marker. +type StackTraceAware interface { + HasStack() bool +} + +// HasStack tells whether a StackTracer exists in the error chain +func HasStack(err error) bool { + if errWithStack, ok := err.(StackTraceAware); ok { + return errWithStack.HasStack() + } + return GetStackTracer(err) != nil +} + +// fundamental is an error that has a message and a stack, but no caller. +type fundamental struct { + msg string + *stack +} + +func (f *fundamental) Error() string { return f.msg } + +func (f *fundamental) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + io.WriteString(s, f.msg) + f.stack.Format(s, verb) + return + } + fallthrough + case 's': + io.WriteString(s, f.msg) + case 'q': + fmt.Fprintf(s, "%q", f.msg) + } +} + +// WithStack annotates err with a stack trace at the point WithStack was called. +// If err is nil, WithStack returns nil. +// +// For most use cases this is deprecated and AddStack should be used (which will ensure just one stack trace). +// However, one may want to use this in some situations, for example to create a 2nd trace across a goroutine. +func WithStack(err error) error { + if err == nil { + return nil + } + + return &withStack{ + err, + callers(), + } +} + +// AddStack is similar to WithStack. +// However, it will first check with HasStack to see if a stack trace already exists in the causer chain before creating another one. +func AddStack(err error) error { + if HasStack(err) { + return err + } + return WithStack(err) +} + +type withStack struct { + error + *stack +} + +func (w *withStack) Cause() error { return w.error } + +func (w *withStack) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + fmt.Fprintf(s, "%+v", w.Cause()) + w.stack.Format(s, verb) + return + } + fallthrough + case 's': + io.WriteString(s, w.Error()) + case 'q': + fmt.Fprintf(s, "%q", w.Error()) + } +} + +// Wrap returns an error annotating err with a stack trace +// at the point Wrap is called, and the supplied message. +// If err is nil, Wrap returns nil. +// +// For most use cases this is deprecated in favor of Annotate. +// Annotate avoids creating duplicate stack traces. +func Wrap(err error, message string) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: message, + causeHasStack: hasStack, + } + return &withStack{ + err, + callers(), + } +} + +// Wrapf returns an error annotating err with a stack trace +// at the point Wrapf is call, and the format specifier. +// If err is nil, Wrapf returns nil. +// +// For most use cases this is deprecated in favor of Annotatef. +// Annotatef avoids creating duplicate stack traces. +func Wrapf(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + causeHasStack: hasStack, + } + return &withStack{ + err, + callers(), + } +} + +// WithMessage annotates err with a new message. +// If err is nil, WithMessage returns nil. +func WithMessage(err error, message string) error { + if err == nil { + return nil + } + return &withMessage{ + cause: err, + msg: message, + causeHasStack: HasStack(err), + } +} + +type withMessage struct { + cause error + msg string + causeHasStack bool +} + +func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } +func (w *withMessage) Cause() error { return w.cause } +func (w *withMessage) HasStack() bool { return w.causeHasStack } + +func (w *withMessage) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + if s.Flag('+') { + fmt.Fprintf(s, "%+v\n", w.Cause()) + io.WriteString(s, w.msg) + return + } + fallthrough + case 's', 'q': + io.WriteString(s, w.Error()) + } +} + +// Cause returns the underlying cause of the error, if possible. +// An error value has a cause if it implements the following +// interface: +// +// type causer interface { +// Cause() error +// } +// +// If the error does not implement Cause, the original error will +// be returned. If the error is nil, nil will be returned without further +// investigation. +func Cause(err error) error { + cause := Unwrap(err) + if cause == nil { + return err + } + return Cause(cause) +} + +// Unwrap uses causer to return the next error in the chain or nil. +// This goes one-level deeper, whereas Cause goes as far as possible +func Unwrap(err error) error { + type causer interface { + Cause() error + } + if unErr, ok := err.(causer); ok { + return unErr.Cause() + } + return nil +} + +// Find an error in the chain that matches a test function. +// returns nil if no error is found. +func Find(origErr error, test func(error) bool) error { + var foundErr error + WalkDeep(origErr, func(err error) bool { + if test(err) { + foundErr = err + return true + } + return false + }) + return foundErr +} diff --git a/vendor/github.com/pingcap/errors/group.go b/vendor/github.com/pingcap/errors/group.go new file mode 100644 index 0000000000000..e5a969ab76f76 --- /dev/null +++ b/vendor/github.com/pingcap/errors/group.go @@ -0,0 +1,42 @@ +package errors + +// ErrorGroup is an interface for multiple errors that are not a chain. +// This happens for example when executing multiple operations in parallel. +type ErrorGroup interface { + Errors() []error +} + +// Errors uses the ErrorGroup interface to return a slice of errors. +// If the ErrorGroup interface is not implemented it returns an array containing just the given error. +func Errors(err error) []error { + if eg, ok := err.(ErrorGroup); ok { + return eg.Errors() + } + return []error{err} +} + +// WalkDeep does a depth-first traversal of all errors. +// Any ErrorGroup is traversed (after going deep). +// The visitor function can return true to end the traversal early +// In that case, WalkDeep will return true, otherwise false. +func WalkDeep(err error, visitor func(err error) bool) bool { + // Go deep + unErr := err + for unErr != nil { + if done := visitor(unErr); done { + return true + } + unErr = Unwrap(unErr) + } + + // Go wide + if group, ok := err.(ErrorGroup); ok { + for _, err := range group.Errors() { + if early := WalkDeep(err, visitor); early { + return true + } + } + } + + return false +} diff --git a/vendor/github.com/pingcap/errors/juju_adaptor.go b/vendor/github.com/pingcap/errors/juju_adaptor.go new file mode 100644 index 0000000000000..0b20f57370c43 --- /dev/null +++ b/vendor/github.com/pingcap/errors/juju_adaptor.go @@ -0,0 +1,79 @@ +package errors + +import ( + "fmt" +) + +// ==================== juju adaptor start ======================== + +// Trace just calls AddStack. +func Trace(err error) error { + return AddStack(err) +} + +// Annotate adds a message and ensures there is a stack trace. +func Annotate(err error, message string) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: message, + causeHasStack: hasStack, + } + if hasStack { + return err + } + return &withStack{ + err, + callers(), + } +} + +// Annotatef adds a message and ensures there is a stack trace. +func Annotatef(err error, format string, args ...interface{}) error { + if err == nil { + return nil + } + hasStack := HasStack(err) + err = &withMessage{ + cause: err, + msg: fmt.Sprintf(format, args...), + causeHasStack: hasStack, + } + if hasStack { + return err + } + return &withStack{ + err, + callers(), + } +} + +// ErrorStack will format a stack trace if it is available, otherwise it will be Error() +// If the error is nil, the empty string is returned +// Note that this just calls fmt.Sprintf("%+v", err) +func ErrorStack(err error) string { + if err == nil { + return "" + } + return fmt.Sprintf("%+v", err) +} + +// NotFoundf represents an error with not found message. +func NotFoundf(format string, args ...interface{}) error { + return Errorf(format+" not found", args...) +} + +// BadRequestf represents an error with bad request message. +func BadRequestf(format string, args ...interface{}) error { + return Errorf(format+" bad request", args...) +} + +// NotSupportedf represents an error with not supported message. +func NotSupportedf(format string, args ...interface{}) error { + return Errorf(format+" not supported", args...) +} + +// ==================== juju adaptor end ======================== diff --git a/vendor/github.com/pingcap/errors/stack.go b/vendor/github.com/pingcap/errors/stack.go new file mode 100644 index 0000000000000..bb1e6a84f339d --- /dev/null +++ b/vendor/github.com/pingcap/errors/stack.go @@ -0,0 +1,226 @@ +package errors + +import ( + "bytes" + "fmt" + "io" + "path" + "runtime" + "strconv" + "strings" +) + +// StackTracer retrieves the StackTrace +// Generally you would want to use the GetStackTracer function to do that. +type StackTracer interface { + StackTrace() StackTrace +} + +// GetStackTracer will return the first StackTracer in the causer chain. +// This function is used by AddStack to avoid creating redundant stack traces. +// +// You can also use the StackTracer interface on the returned error to get the stack trace. +func GetStackTracer(origErr error) StackTracer { + var stacked StackTracer + WalkDeep(origErr, func(err error) bool { + if stackTracer, ok := err.(StackTracer); ok { + stacked = stackTracer + return true + } + return false + }) + return stacked +} + +// Frame represents a program counter inside a stack frame. +type Frame uintptr + +// pc returns the program counter for this frame; +// multiple frames may have the same PC value. +func (f Frame) pc() uintptr { return uintptr(f) - 1 } + +// file returns the full path to the file that contains the +// function for this Frame's pc. +func (f Frame) file() string { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return "unknown" + } + file, _ := fn.FileLine(f.pc()) + return file +} + +// line returns the line number of source code of the +// function for this Frame's pc. +func (f Frame) line() int { + fn := runtime.FuncForPC(f.pc()) + if fn == nil { + return 0 + } + _, line := fn.FileLine(f.pc()) + return line +} + +// Format formats the frame according to the fmt.Formatter interface. +// +// %s source file +// %d source line +// %n function name +// %v equivalent to %s:%d +// +// Format accepts flags that alter the printing of some verbs, as follows: +// +// %+s function name and path of source file relative to the compile time +// GOPATH separated by \n\t (\n\t) +// %+v equivalent to %+s:%d +func (f Frame) Format(s fmt.State, verb rune) { + f.format(s, s, verb) +} + +// format allows stack trace printing calls to be made with a bytes.Buffer. +func (f Frame) format(w io.Writer, s fmt.State, verb rune) { + switch verb { + case 's': + switch { + case s.Flag('+'): + pc := f.pc() + fn := runtime.FuncForPC(pc) + if fn == nil { + io.WriteString(w, "unknown") + } else { + file, _ := fn.FileLine(pc) + io.WriteString(w, fn.Name()) + io.WriteString(w, "\n\t") + io.WriteString(w, file) + } + default: + io.WriteString(w, path.Base(f.file())) + } + case 'd': + io.WriteString(w, strconv.Itoa(f.line())) + case 'n': + name := runtime.FuncForPC(f.pc()).Name() + io.WriteString(w, funcname(name)) + case 'v': + f.format(w, s, 's') + io.WriteString(w, ":") + f.format(w, s, 'd') + } +} + +// StackTrace is stack of Frames from innermost (newest) to outermost (oldest). +type StackTrace []Frame + +// Format formats the stack of Frames according to the fmt.Formatter interface. +// +// %s lists source files for each Frame in the stack +// %v lists the source file and line number for each Frame in the stack +// +// Format accepts flags that alter the printing of some verbs, as follows: +// +// %+v Prints filename, function, and line number for each Frame in the stack. +func (st StackTrace) Format(s fmt.State, verb rune) { + var b bytes.Buffer + switch verb { + case 'v': + switch { + case s.Flag('+'): + b.Grow(len(st) * stackMinLen) + for _, fr := range st { + b.WriteByte('\n') + fr.format(&b, s, verb) + } + case s.Flag('#'): + fmt.Fprintf(&b, "%#v", []Frame(st)) + default: + st.formatSlice(&b, s, verb) + } + case 's': + st.formatSlice(&b, s, verb) + } + io.Copy(s, &b) +} + +// formatSlice will format this StackTrace into the given buffer as a slice of +// Frame, only valid when called with '%s' or '%v'. +func (st StackTrace) formatSlice(b *bytes.Buffer, s fmt.State, verb rune) { + b.WriteByte('[') + if len(st) == 0 { + b.WriteByte(']') + return + } + + b.Grow(len(st) * (stackMinLen / 4)) + st[0].format(b, s, verb) + for _, fr := range st[1:] { + b.WriteByte(' ') + fr.format(b, s, verb) + } + b.WriteByte(']') +} + +// stackMinLen is a best-guess at the minimum length of a stack trace. It +// doesn't need to be exact, just give a good enough head start for the buffer +// to avoid the expensive early growth. +const stackMinLen = 96 + +// stack represents a stack of program counters. +type stack []uintptr + +func (s *stack) Format(st fmt.State, verb rune) { + switch verb { + case 'v': + switch { + case st.Flag('+'): + var b bytes.Buffer + b.Grow(len(*s) * stackMinLen) + for _, pc := range *s { + f := Frame(pc) + b.WriteByte('\n') + f.format(&b, st, 'v') + } + io.Copy(st, &b) + } + } +} + +func (s *stack) StackTrace() StackTrace { + f := make([]Frame, len(*s)) + for i := 0; i < len(f); i++ { + f[i] = Frame((*s)[i]) + } + return f +} + +func callers() *stack { + return callersSkip(4) +} + +func callersSkip(skip int) *stack { + const depth = 32 + var pcs [depth]uintptr + n := runtime.Callers(skip, pcs[:]) + var st stack = pcs[0:n] + return &st +} + +// funcname removes the path prefix component of a function's name reported by func.Name(). +func funcname(name string) string { + i := strings.LastIndex(name, "/") + name = name[i+1:] + i = strings.Index(name, ".") + return name[i+1:] +} + +// NewStack is for library implementers that want to generate a stack trace. +// Normally you should insted use AddStack to get an error with a stack trace. +// +// The result of this function can be turned into a stack trace by calling .StackTrace() +// +// This function takes an argument for the number of stack frames to skip. +// This avoids putting stack generation function calls like this one in the stack trace. +// A value of 0 will give you the line that called NewStack(0) +// A library author wrapping this in their own function will want to use a value of at least 1. +func NewStack(skip int) StackTracer { + return callersSkip(skip + 3) +} diff --git a/vendor/github.com/pingcap/parser/LICENSE b/vendor/github.com/pingcap/parser/LICENSE new file mode 100644 index 0000000000000..261eeb9e9f8b2 --- /dev/null +++ b/vendor/github.com/pingcap/parser/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ast/ast.go b/vendor/github.com/pingcap/parser/ast/ast.go similarity index 73% rename from ast/ast.go rename to vendor/github.com/pingcap/parser/ast/ast.go index 3cc2da1f20e1b..2f3be0b4b4f5a 100644 --- a/ast/ast.go +++ b/vendor/github.com/pingcap/parser/ast/ast.go @@ -18,10 +18,8 @@ package ast import ( "io" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/chunk" - "golang.org/x/net/context" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" ) // Node is the basic element of the AST. @@ -64,14 +62,6 @@ type ExprNode interface { SetType(tp *types.FieldType) // GetType gets the evaluation type of the expression. GetType() *types.FieldType - // SetValue sets value to the expression. - SetValue(val interface{}) - // GetValue gets value of the expression. - GetValue() interface{} - // SetDatum sets datum to the expression. - SetDatum(datum types.Datum) - // GetDatum gets datum of the expression. - GetDatum() *types.Datum // SetFlag sets flag to the expression. // Flag indicates whether the expression contains // parameter marker, reference, aggregate function... @@ -138,31 +128,6 @@ type ResultField struct { Referenced bool } -// RecordSet is an abstract result set interface to help get data from Plan. -type RecordSet interface { - // Fields gets result fields. - Fields() []*ResultField - - // Next reads records into chunk. - Next(ctx context.Context, chk *chunk.Chunk) error - - // NewChunk creates a new chunk with initial capacity. - NewChunk() *chunk.Chunk - - // Close closes the underlying iterator, call Next after Close will - // restart the iteration. - Close() error -} - -// RowToDatums converts row to datum slice. -func RowToDatums(row chunk.Row, fields []*ResultField) []types.Datum { - datums := make([]types.Datum, len(fields)) - for i, f := range fields { - datums[i] = row.GetDatum(i, &f.Column.FieldType) - } - return datums -} - // ResultSetNode interface has a ResultFields property, represents a Node that returns result set. // Implementations include SelectStmt, SubqueryExpr, TableSource, TableName and Join. type ResultSetNode interface { @@ -176,28 +141,6 @@ type SensitiveStmtNode interface { SecureText() string } -// Statement is an interface for SQL execution. -// NOTE: all Statement implementations must be safe for -// concurrent using by multiple goroutines. -// If the Exec method requires any Execution domain local data, -// they must be held out of the implementing instance. -type Statement interface { - // OriginText gets the origin SQL text. - OriginText() string - - // Exec executes SQL and gets a Recordset. - Exec(ctx context.Context) (RecordSet, error) - - // IsPrepared returns whether this statement is prepared statement. - IsPrepared() bool - - // IsReadOnly returns if the statement is read only. For example: SelectStmt without lock. - IsReadOnly() bool - - // RebuildPlan rebuilds the plan of the statement. - RebuildPlan() (schemaVersion int64, err error) -} - // Visitor visits a Node. type Visitor interface { // Enter is called before children nodes are visited. diff --git a/ast/base.go b/vendor/github.com/pingcap/parser/ast/base.go similarity index 89% rename from ast/base.go rename to vendor/github.com/pingcap/parser/ast/base.go index 75ad175dce039..984d8e4d95802 100644 --- a/ast/base.go +++ b/vendor/github.com/pingcap/parser/ast/base.go @@ -13,7 +13,7 @@ package ast -import "github.com/pingcap/tidb/types" +import "github.com/pingcap/parser/types" // node is the struct implements node interface except for Accept method. // Node implementations should embed it in. @@ -62,20 +62,12 @@ func (dn *dmlNode) dmlStatement() {} // Expression implementations should embed it in. type exprNode struct { node - types.Datum Type types.FieldType flag uint64 } -// SetDatum implements ExprNode interface. -func (en *exprNode) SetDatum(datum types.Datum) { - en.Datum = datum -} - -// GetDatum implements ExprNode interface. -func (en *exprNode) GetDatum() *types.Datum { - return &en.Datum -} +// TexprNode is exported for parser driver. +type TexprNode = exprNode // SetType implements ExprNode interface. func (en *exprNode) SetType(tp *types.FieldType) { diff --git a/ast/ddl.go b/vendor/github.com/pingcap/parser/ast/ddl.go similarity index 99% rename from ast/ddl.go rename to vendor/github.com/pingcap/parser/ast/ddl.go index 340027e881c6f..aefa2eed2dd13 100644 --- a/ast/ddl.go +++ b/vendor/github.com/pingcap/parser/ast/ddl.go @@ -14,8 +14,8 @@ package ast import ( - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/types" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" ) var ( diff --git a/ast/dml.go b/vendor/github.com/pingcap/parser/ast/dml.go similarity index 99% rename from ast/dml.go rename to vendor/github.com/pingcap/parser/ast/dml.go index d3f6575dee0fe..2046f3ad24eb9 100644 --- a/ast/dml.go +++ b/vendor/github.com/pingcap/parser/ast/dml.go @@ -14,9 +14,9 @@ package ast import ( - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/auth" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" ) var ( diff --git a/ast/expressions.go b/vendor/github.com/pingcap/parser/ast/expressions.go similarity index 89% rename from ast/expressions.go rename to vendor/github.com/pingcap/parser/ast/expressions.go index ca22017330e0f..e81f878760b8d 100644 --- a/ast/expressions.go +++ b/vendor/github.com/pingcap/parser/ast/expressions.go @@ -17,13 +17,10 @@ import ( "fmt" "io" "regexp" - "strconv" "strings" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/types" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/opcode" ) var ( @@ -36,7 +33,6 @@ var ( _ ExprNode = &ExistsSubqueryExpr{} _ ExprNode = &IsNullExpr{} _ ExprNode = &IsTruthExpr{} - _ ExprNode = &ParamMarkerExpr{} _ ExprNode = &ParenthesesExpr{} _ ExprNode = &PatternInExpr{} _ ExprNode = &PatternLikeExpr{} @@ -45,7 +41,6 @@ var ( _ ExprNode = &RowExpr{} _ ExprNode = &SubqueryExpr{} _ ExprNode = &UnaryOperationExpr{} - _ ExprNode = &ValueExpr{} _ ExprNode = &ValuesExpr{} _ ExprNode = &VariableExpr{} @@ -53,81 +48,22 @@ var ( _ Node = &WhenClause{} ) -// ValueExpr is the simple value expression. -type ValueExpr struct { - exprNode - projectionOffset int -} - -// Format the ExprNode into a Writer. -func (n *ValueExpr) Format(w io.Writer) { - var s string - switch n.Kind() { - case types.KindNull: - s = "NULL" - case types.KindInt64: - if n.Type.Flag&mysql.IsBooleanFlag != 0 { - if n.GetInt64() > 0 { - s = "TRUE" - } else { - s = "FALSE" - } - } else { - s = strconv.FormatInt(n.GetInt64(), 10) - } - case types.KindUint64: - s = strconv.FormatUint(n.GetUint64(), 10) - case types.KindFloat32: - s = strconv.FormatFloat(n.GetFloat64(), 'e', -1, 32) - case types.KindFloat64: - s = strconv.FormatFloat(n.GetFloat64(), 'e', -1, 64) - case types.KindString, types.KindBytes: - s = strconv.Quote(n.GetString()) - case types.KindMysqlDecimal: - s = n.GetMysqlDecimal().String() - case types.KindBinaryLiteral: - if n.Type.Flag&mysql.UnsignedFlag != 0 { - s = fmt.Sprintf("x'%x'", n.GetBytes()) - } else { - s = n.GetBinaryLiteral().ToBitLiteralString(true) - } - default: - panic("Can't format to string") - } - fmt.Fprint(w, s) +// 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. -func NewValueExpr(value interface{}) *ValueExpr { - if ve, ok := value.(*ValueExpr); ok { - return ve - } - ve := &ValueExpr{} - ve.SetValue(value) - types.DefaultTypeForValue(value, &ve.Type) - ve.projectionOffset = -1 - return ve -} +var NewValueExpr func(interface{}) ValueExpr -// SetProjectionOffset sets ValueExpr.projectionOffset for logical plan builder. -func (n *ValueExpr) SetProjectionOffset(offset int) { - n.projectionOffset = offset -} - -// GetProjectionOffset returns ValueExpr.projectionOffset. -func (n *ValueExpr) GetProjectionOffset() int { - return n.projectionOffset -} - -// Accept implements Node interface. -func (n *ValueExpr) Accept(v Visitor) (Node, bool) { - newNode, skipChildren := v.Enter(n) - if skipChildren { - return v.Leave(newNode) - } - n = newNode.(*ValueExpr) - return v.Leave(n) -} +// NewParamMarkerExpr creates a ParamMarkerExpr. +var NewParamMarkerExpr func(offset int) ParamMarkerExpr // BetweenExpr is for "between and" or "not between and" expression. type BetweenExpr struct { @@ -721,25 +657,9 @@ func (n *PatternLikeExpr) Accept(v Visitor) (Node, bool) { // ParamMarkerExpr expression holds a place for another expression. // Used in parsing prepare statement. -type ParamMarkerExpr struct { - exprNode - Offset int - Order int -} - -// Format the ExprNode into a Writer. -func (n *ParamMarkerExpr) Format(w io.Writer) { - panic("Not implemented") -} - -// Accept implements Node Accept interface. -func (n *ParamMarkerExpr) Accept(v Visitor) (Node, bool) { - newNode, skipChildren := v.Enter(n) - if skipChildren { - return v.Leave(newNode) - } - n = newNode.(*ParamMarkerExpr) - return v.Leave(n) +type ParamMarkerExpr interface { + ValueExpr + SetOrder(int) } // ParenthesesExpr is the parentheses expression. diff --git a/ast/flag.go b/vendor/github.com/pingcap/parser/ast/flag.go similarity index 98% rename from ast/flag.go rename to vendor/github.com/pingcap/parser/ast/flag.go index 6883f82e138e6..773a2b44483e7 100644 --- a/ast/flag.go +++ b/vendor/github.com/pingcap/parser/ast/flag.go @@ -32,6 +32,9 @@ func (f *flagSetter) Enter(in Node) (Node, bool) { } 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) @@ -57,8 +60,6 @@ func (f *flagSetter) Leave(in Node) (Node, bool) { x.SetFlag(x.Expr.GetFlag()) case *IsTruthExpr: x.SetFlag(x.Expr.GetFlag()) - case *ParamMarkerExpr: - x.SetFlag(FlagHasParamMarker) case *ParenthesesExpr: x.SetFlag(x.Expr.GetFlag()) case *PatternInExpr: @@ -75,7 +76,6 @@ func (f *flagSetter) Leave(in Node) (Node, bool) { x.SetFlag(FlagHasSubquery) case *UnaryOperationExpr: x.SetFlag(x.V.GetFlag()) - case *ValueExpr: case *ValuesExpr: x.SetFlag(FlagHasReference) case *VariableExpr: diff --git a/ast/functions.go b/vendor/github.com/pingcap/parser/ast/functions.go similarity index 98% rename from ast/functions.go rename to vendor/github.com/pingcap/parser/ast/functions.go index bdd81485b92d6..495c6e54f030b 100644 --- a/ast/functions.go +++ b/vendor/github.com/pingcap/parser/ast/functions.go @@ -17,8 +17,8 @@ import ( "fmt" "io" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/types" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/types" ) var ( @@ -346,10 +346,10 @@ func (n *FuncCallExpr) specialFormatArgs(w io.Writer) bool { n.Args[0].Format(w) fmt.Fprint(w, ", INTERVAL ") n.Args[1].Format(w) - fmt.Fprintf(w, " %s", n.Args[2].GetDatum().GetString()) + fmt.Fprintf(w, " %s", n.Args[2].(ValueExpr).GetDatumString()) return true case TimestampAdd, TimestampDiff: - fmt.Fprintf(w, "%s, ", n.Args[0].GetDatum().GetString()) + fmt.Fprintf(w, "%s, ", n.Args[0].(ValueExpr).GetDatumString()) n.Args[1].Format(w) fmt.Fprint(w, ", ") n.Args[2].Format(w) diff --git a/ast/misc.go b/vendor/github.com/pingcap/parser/ast/misc.go similarity index 97% rename from ast/misc.go rename to vendor/github.com/pingcap/parser/ast/misc.go index c4493a24ccd66..fd179f6c6394d 100644 --- a/ast/misc.go +++ b/vendor/github.com/pingcap/parser/ast/misc.go @@ -18,9 +18,9 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/auth" + "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" ) var ( @@ -187,7 +187,7 @@ func (n *DeallocateStmt) Accept(v Visitor) (Node, bool) { // Prepared represents a prepared statement. type Prepared struct { Stmt StmtNode - Params []*ParamMarkerExpr + Params []ParamMarkerExpr SchemaVersion int64 UseCache bool } @@ -321,7 +321,7 @@ type VariableAssignment struct { // 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 + ExtendValue ValueExpr } // Accept implements Node interface. @@ -868,3 +868,12 @@ func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) { 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/read_only_checker.go b/vendor/github.com/pingcap/parser/ast/read_only_checker.go similarity index 100% rename from ast/read_only_checker.go rename to vendor/github.com/pingcap/parser/ast/read_only_checker.go diff --git a/ast/stats.go b/vendor/github.com/pingcap/parser/ast/stats.go similarity index 98% rename from ast/stats.go rename to vendor/github.com/pingcap/parser/ast/stats.go index ea13f24d7a2f0..5db8664a511e2 100644 --- a/ast/stats.go +++ b/vendor/github.com/pingcap/parser/ast/stats.go @@ -13,7 +13,7 @@ package ast -import "github.com/pingcap/tidb/model" +import "github.com/pingcap/parser/model" var ( _ StmtNode = &AnalyzeTableStmt{} diff --git a/util/auth/auth.go b/vendor/github.com/pingcap/parser/auth/auth.go similarity index 84% rename from util/auth/auth.go rename to vendor/github.com/pingcap/parser/auth/auth.go index 0c60b7d67d892..1d33fbdc01e37 100644 --- a/util/auth/auth.go +++ b/vendor/github.com/pingcap/parser/auth/auth.go @@ -19,15 +19,17 @@ import ( "encoding/hex" "fmt" - "github.com/pingcap/tidb/terror" - "github.com/pkg/errors" + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" ) // UserIdentity represents username and hostname. type UserIdentity struct { - Username string - Hostname string - CurrentUser bool + 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. @@ -36,6 +38,12 @@ func (user *UserIdentity) String() string { 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() diff --git a/util/charset/charset.go b/vendor/github.com/pingcap/parser/charset/charset.go similarity index 99% rename from util/charset/charset.go rename to vendor/github.com/pingcap/parser/charset/charset.go index 6967b9537a65c..0511f554019e0 100644 --- a/util/charset/charset.go +++ b/vendor/github.com/pingcap/parser/charset/charset.go @@ -16,8 +16,8 @@ package charset import ( "strings" - "github.com/pingcap/tidb/mysql" - "github.com/pkg/errors" + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" ) // Charset is a charset. diff --git a/util/charset/encoding_table.go b/vendor/github.com/pingcap/parser/charset/encoding_table.go similarity index 100% rename from util/charset/encoding_table.go rename to vendor/github.com/pingcap/parser/charset/encoding_table.go diff --git a/vendor/github.com/pingcap/parser/format/format.go b/vendor/github.com/pingcap/parser/format/format.go new file mode 100644 index 0000000000000..0a14a6d362650 --- /dev/null +++ b/vendor/github.com/pingcap/parser/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/parser/lexer.go b/vendor/github.com/pingcap/parser/lexer.go similarity index 99% rename from parser/lexer.go rename to vendor/github.com/pingcap/parser/lexer.go index f82708383629c..beabc37c6a83f 100644 --- a/parser/lexer.go +++ b/vendor/github.com/pingcap/parser/lexer.go @@ -20,7 +20,7 @@ import ( "unicode" "unicode/utf8" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" ) var _ = yyLexer(&Scanner{}) diff --git a/parser/misc.go b/vendor/github.com/pingcap/parser/misc.go similarity index 99% rename from parser/misc.go rename to vendor/github.com/pingcap/parser/misc.go index 51c623016dd05..fbf19262eb839 100644 --- a/parser/misc.go +++ b/vendor/github.com/pingcap/parser/misc.go @@ -16,8 +16,7 @@ package parser import ( "strings" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/parser/charset" ) func isLetter(ch rune) bool { @@ -584,7 +583,7 @@ func (s *Scanner) isTokenIdentifier(lit string, offset int) int { } } - checkBtFuncToken, tokenStr := false, hack.String(data) + checkBtFuncToken, tokenStr := false, string(data) if s.r.peek() == '(' { checkBtFuncToken = true } else if s.sqlMode.HasIgnoreSpaceMode() { diff --git a/model/ddl.go b/vendor/github.com/pingcap/parser/model/ddl.go similarity index 99% rename from model/ddl.go rename to vendor/github.com/pingcap/parser/model/ddl.go index 23db9df3e2d90..fa7e9887ec063 100644 --- a/model/ddl.go +++ b/vendor/github.com/pingcap/parser/model/ddl.go @@ -20,8 +20,8 @@ import ( "sync" "time" - "github.com/pingcap/tidb/terror" - "github.com/pkg/errors" + "github.com/pingcap/errors" + "github.com/pingcap/parser/terror" ) // ActionType is the type for DDL action. diff --git a/model/flags.go b/vendor/github.com/pingcap/parser/model/flags.go similarity index 100% rename from model/flags.go rename to vendor/github.com/pingcap/parser/model/flags.go diff --git a/model/model.go b/vendor/github.com/pingcap/parser/model/model.go similarity index 97% rename from model/model.go rename to vendor/github.com/pingcap/parser/model/model.go index c488ac86a4791..22891f9d25ef3 100644 --- a/model/model.go +++ b/vendor/github.com/pingcap/parser/model/model.go @@ -15,15 +15,13 @@ package model import ( "encoding/json" - "fmt" "strings" "time" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/errors" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/types" "github.com/pingcap/tipb/go-tipb" - "github.com/pkg/errors" ) // SchemaState is the state for schema elements. @@ -114,7 +112,7 @@ func (c *ColumnInfo) SetDefaultValue(value interface{}) error { // 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 hack.String(c.DefaultValueBit) + return string(c.DefaultValueBit) } return c.DefaultValue } @@ -318,6 +316,16 @@ type PartitionInfo struct { 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"` @@ -557,7 +565,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 } diff --git a/mysql/charset.go b/vendor/github.com/pingcap/parser/mysql/charset.go similarity index 100% rename from mysql/charset.go rename to vendor/github.com/pingcap/parser/mysql/charset.go diff --git a/mysql/const.go b/vendor/github.com/pingcap/parser/mysql/const.go similarity index 100% rename from mysql/const.go rename to vendor/github.com/pingcap/parser/mysql/const.go diff --git a/mysql/errcode.go b/vendor/github.com/pingcap/parser/mysql/errcode.go similarity index 100% rename from mysql/errcode.go rename to vendor/github.com/pingcap/parser/mysql/errcode.go diff --git a/mysql/errname.go b/vendor/github.com/pingcap/parser/mysql/errname.go similarity index 100% rename from mysql/errname.go rename to vendor/github.com/pingcap/parser/mysql/errname.go diff --git a/mysql/error.go b/vendor/github.com/pingcap/parser/mysql/error.go similarity index 100% rename from mysql/error.go rename to vendor/github.com/pingcap/parser/mysql/error.go diff --git a/mysql/locale_format.go b/vendor/github.com/pingcap/parser/mysql/locale_format.go similarity index 98% rename from mysql/locale_format.go rename to vendor/github.com/pingcap/parser/mysql/locale_format.go index 62037e854e268..b483f94fc189f 100644 --- a/mysql/locale_format.go +++ b/vendor/github.com/pingcap/parser/mysql/locale_format.go @@ -6,7 +6,7 @@ import ( "strings" "unicode" - "github.com/pkg/errors" + "github.com/pingcap/errors" ) func formatENUS(number string, precision string) (string, error) { diff --git a/mysql/state.go b/vendor/github.com/pingcap/parser/mysql/state.go similarity index 100% rename from mysql/state.go rename to vendor/github.com/pingcap/parser/mysql/state.go diff --git a/mysql/type.go b/vendor/github.com/pingcap/parser/mysql/type.go similarity index 86% rename from mysql/type.go rename to vendor/github.com/pingcap/parser/mysql/type.go index 9e7f433906f3c..9ea32f90dd34e 100644 --- a/mysql/type.go +++ b/vendor/github.com/pingcap/parser/mysql/type.go @@ -69,11 +69,12 @@ const ( 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 */ + 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. @@ -147,3 +148,8 @@ func HasParseToJSONFlag(flag uint) bool { 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/util.go b/vendor/github.com/pingcap/parser/mysql/util.go similarity index 100% rename from mysql/util.go rename to vendor/github.com/pingcap/parser/mysql/util.go diff --git a/parser/opcode/opcode.go b/vendor/github.com/pingcap/parser/opcode/opcode.go similarity index 100% rename from parser/opcode/opcode.go rename to vendor/github.com/pingcap/parser/opcode/opcode.go diff --git a/vendor/github.com/pingcap/parser/parser.go b/vendor/github.com/pingcap/parser/parser.go new file mode 100644 index 0000000000000..560f39ccd44e4 --- /dev/null +++ b/vendor/github.com/pingcap/parser/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 */ +} diff --git a/vendor/github.com/pingcap/parser/terror/terror.go b/vendor/github.com/pingcap/parser/terror/terror.go new file mode 100644 index 0000000000000..a5443653d71cd --- /dev/null +++ b/vendor/github.com/pingcap/parser/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/vendor/github.com/pingcap/parser/types/etc.go b/vendor/github.com/pingcap/parser/types/etc.go new file mode 100644 index 0000000000000..84b2966c55e67 --- /dev/null +++ b/vendor/github.com/pingcap/parser/types/etc.go @@ -0,0 +1,112 @@ +// 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/parser/mysql" + "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 +} + +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", +} + +// TypeStr converts tp to a string. +func TypeStr(tp byte) (r string) { + return type2Str[tp] +} + +// 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 +} + +var ( + dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} +) + +// constant values. +const ( + digitsPerWord = 9 // A word holds 9 digits. + wordSize = 4 // A word is 4 bytes int32. +) + +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/vendor/github.com/pingcap/parser/types/eval_type.go b/vendor/github.com/pingcap/parser/types/eval_type.go new file mode 100644 index 0000000000000..47775953d97c5 --- /dev/null +++ b/vendor/github.com/pingcap/parser/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/vendor/github.com/pingcap/parser/types/field_type.go b/vendor/github.com/pingcap/parser/types/field_type.go new file mode 100644 index 0000000000000..4b299cdb63eda --- /dev/null +++ b/vendor/github.com/pingcap/parser/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/parser/yy_parser.go b/vendor/github.com/pingcap/parser/yy_parser.go similarity index 95% rename from parser/yy_parser.go rename to vendor/github.com/pingcap/parser/yy_parser.go index 48098ef3e9158..0507d7d71d93d 100644 --- a/parser/yy_parser.go +++ b/vendor/github.com/pingcap/parser/yy_parser.go @@ -19,12 +19,10 @@ import ( "strconv" "unicode" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/hack" - "github.com/pkg/errors" + "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" ) const ( @@ -189,8 +187,7 @@ func toInt(l yyLexer, lval *yySymType, str string) int { } func toDecimal(l yyLexer, lval *yySymType, str string) int { - dec := new(types.MyDecimal) - err := dec.FromString(hack.Slice(str)) + dec, err := ast.NewDecimal(str) if err != nil { l.Errorf("decimal literal: %v", err) } @@ -211,7 +208,7 @@ func toFloat(l yyLexer, lval *yySymType, str string) int { // See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html func toHex(l yyLexer, lval *yySymType, str string) int { - h, err := types.NewHexLiteral(str) + h, err := ast.NewHexLiteral(str) if err != nil { l.Errorf("hex literal: %v", err) return int(unicode.ReplacementChar) @@ -222,7 +219,7 @@ func toHex(l yyLexer, lval *yySymType, str string) int { // See https://dev.mysql.com/doc/refman/5.7/en/bit-type.html func toBit(l yyLexer, lval *yySymType, str string) int { - b, err := types.NewBitLiteral(str) + b, err := ast.NewBitLiteral(str) if err != nil { l.Errorf("bit literal: %v", err) return int(unicode.ReplacementChar) diff --git a/vendor/github.com/pingcap/tipb/go-tipb/expression.pb.go b/vendor/github.com/pingcap/tipb/go-tipb/expression.pb.go index e7d2699ead8dd..26459ba6422d5 100644 --- a/vendor/github.com/pingcap/tipb/go-tipb/expression.pb.go +++ b/vendor/github.com/pingcap/tipb/go-tipb/expression.pb.go @@ -43,23 +43,25 @@ const ( // Column reference. value is int64 column ID. ExprType_ColumnRef ExprType = 201 // Aggregate functions. - ExprType_Count ExprType = 3001 - ExprType_Sum ExprType = 3002 - ExprType_Avg ExprType = 3003 - ExprType_Min ExprType = 3004 - ExprType_Max ExprType = 3005 - ExprType_First ExprType = 3006 - ExprType_GroupConcat ExprType = 3007 - ExprType_Agg_BitAnd ExprType = 3008 - ExprType_Agg_BitOr ExprType = 3009 - ExprType_Agg_BitXor ExprType = 3010 - ExprType_Std ExprType = 3011 - ExprType_Stddev ExprType = 3012 - ExprType_StddevPop ExprType = 3013 - ExprType_StddevSamp ExprType = 3014 - ExprType_VarPop ExprType = 3015 - ExprType_VarSamp ExprType = 3016 - ExprType_Variance ExprType = 3017 + ExprType_Count ExprType = 3001 + ExprType_Sum ExprType = 3002 + ExprType_Avg ExprType = 3003 + ExprType_Min ExprType = 3004 + ExprType_Max ExprType = 3005 + ExprType_First ExprType = 3006 + ExprType_GroupConcat ExprType = 3007 + ExprType_Agg_BitAnd ExprType = 3008 + ExprType_Agg_BitOr ExprType = 3009 + ExprType_Agg_BitXor ExprType = 3010 + ExprType_Std ExprType = 3011 + ExprType_Stddev ExprType = 3012 + ExprType_StddevPop ExprType = 3013 + ExprType_StddevSamp ExprType = 3014 + ExprType_VarPop ExprType = 3015 + ExprType_VarSamp ExprType = 3016 + ExprType_Variance ExprType = 3017 + ExprType_JsonArrayAgg ExprType = 3018 + ExprType_JsonObjectAgg ExprType = 3019 // Scalar Function ExprType_ScalarFunc ExprType = 10000 ) @@ -99,6 +101,8 @@ var ExprType_name = map[int32]string{ 3015: "VarPop", 3016: "VarSamp", 3017: "Variance", + 3018: "JsonArrayAgg", + 3019: "JsonObjectAgg", 10000: "ScalarFunc", } var ExprType_value = map[string]int32{ @@ -136,6 +140,8 @@ var ExprType_value = map[string]int32{ "VarPop": 3015, "VarSamp": 3016, "Variance": 3017, + "JsonArrayAgg": 3018, + "JsonObjectAgg": 3019, "ScalarFunc": 10000, } @@ -487,6 +493,7 @@ const ( ScalarFuncSig_JsonDepthSig ScalarFuncSig = 5022 ScalarFuncSig_JsonKeysSig ScalarFuncSig = 5023 ScalarFuncSig_JsonLengthSig ScalarFuncSig = 5024 + ScalarFuncSig_JsonKeys2ArgsSig ScalarFuncSig = 5025 // time ScalarFuncSig_DateFormatSig ScalarFuncSig = 6001 ScalarFuncSig_DateLiteral ScalarFuncSig = 6002 @@ -975,6 +982,7 @@ var ScalarFuncSig_name = map[int32]string{ 5022: "JsonDepthSig", 5023: "JsonKeysSig", 5024: "JsonLengthSig", + 5025: "JsonKeys2ArgsSig", 6001: "DateFormatSig", 6002: "DateLiteral", 6003: "DateDiff", @@ -1460,6 +1468,7 @@ var ScalarFuncSig_value = map[string]int32{ "JsonDepthSig": 5022, "JsonKeysSig": 5023, "JsonLengthSig": 5024, + "JsonKeys2ArgsSig": 5025, "DateFormatSig": 6001, "DateLiteral": 6002, "DateDiff": 6003, @@ -2573,272 +2582,274 @@ var ( func init() { proto.RegisterFile("expression.proto", fileDescriptorExpression) } var fileDescriptorExpression = []byte{ - // 4269 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x5a, 0x69, 0x74, 0x1c, 0xd5, - 0x95, 0xa6, 0x6d, 0x19, 0xec, 0xf2, 0x76, 0x29, 0x6c, 0xd4, 0x61, 0xce, 0xd8, 0x32, 0xca, 0x19, - 0x11, 0x32, 0xa3, 0x4e, 0x8c, 0x69, 0xcd, 0x8f, 0xd9, 0x5a, 0x6a, 0x59, 0x74, 0x46, 0x92, 0x65, - 0x75, 0xcb, 0x64, 0x7e, 0xe5, 0x94, 0xba, 0x9f, 0x5a, 0x05, 0xdd, 0x55, 0x4d, 0xd5, 0x6b, 0x59, - 0x62, 0x96, 0xc3, 0xbe, 0x83, 0x6d, 0x16, 0xdb, 0xec, 0x3b, 0x84, 0x7d, 0x49, 0xd8, 0xf7, 0x2d, - 0xd8, 0xec, 0x04, 0xf0, 0x02, 0x84, 0x10, 0x93, 0x8d, 0x25, 0x21, 0x84, 0x7d, 0xcd, 0x9c, 0xfb, - 0xbd, 0xf7, 0xaa, 0xab, 0x25, 0x7e, 0xb9, 0xde, 0xf7, 0xee, 0xfd, 0xee, 0x77, 0xef, 0xdb, 0xdb, - 0xb2, 0x48, 0x4c, 0xd6, 0x02, 0x11, 0x86, 0xae, 0xef, 0x75, 0xd6, 0x02, 0x5f, 0xfa, 0x76, 0x8b, - 0x74, 0x6b, 0xa3, 0x07, 0x2c, 0x29, 0xfb, 0x65, 0x1f, 0x40, 0x8a, 0xbf, 0x54, 0xdf, 0x81, 0x77, - 0x24, 0xac, 0x79, 0xab, 0x5d, 0x51, 0x29, 0x15, 0xa6, 0x6a, 0xc2, 0x5e, 0x62, 0xcd, 0x92, 0xb5, - 0x64, 0xa2, 0x2d, 0x71, 0xd0, 0x9c, 0xee, 0x96, 0x6d, 0x6f, 0x2c, 0xdf, 0x6b, 0x78, 0x96, 0xac, - 0xd9, 0x49, 0xab, 0x65, 0xac, 0xe2, 0x94, 0x93, 0xb3, 0xda, 0x12, 0x07, 0x2d, 0xd4, 0x38, 0x10, - 0xd5, 0x23, 0xbc, 0xe4, 0xec, 0x98, 0x07, 0x10, 0x7b, 0x99, 0xb5, 0x4f, 0x49, 0x14, 0xdd, 0xaa, - 0x53, 0x49, 0xb6, 0xc4, 0x3a, 0x0d, 0xc8, 0xfd, 0x45, 0xbf, 0x52, 0x71, 0xa4, 0x48, 0xce, 0x89, - 0xf7, 0x6b, 0x10, 0xfd, 0xe3, 0x4e, 0x10, 0x0a, 0x99, 0xdc, 0xbb, 0x2d, 0x71, 0xd0, 0xbc, 0xa8, - 0x5f, 0x81, 0x07, 0x3e, 0x96, 0xb0, 0x5a, 0x7a, 0x27, 0x6b, 0x81, 0xfd, 0xdd, 0x48, 0xf2, 0xa2, - 0x95, 0x8b, 0x3a, 0x39, 0xd3, 0x4e, 0xc6, 0x39, 0x9d, 0x58, 0x0a, 0x64, 0xcd, 0x9e, 0x70, 0x2a, - 0xc8, 0x60, 0xc1, 0x30, 0x7f, 0xda, 0xff, 0x60, 0xcd, 0x2d, 0x8e, 0xbb, 0x95, 0x52, 0x00, 0xf9, - 0xb3, 0x0f, 0x9a, 0xbf, 0xd2, 0x6a, 0x78, 0x0f, 0x47, 0x7d, 0xf6, 0xf7, 0xad, 0xd9, 0xa1, 0x5b, - 0x46, 0x12, 0x8b, 0x56, 0xee, 0xa7, 0x4c, 0xf2, 0x45, 0xa7, 0xe2, 0x04, 0xab, 0xeb, 0x5e, 0x31, - 0xef, 0x96, 0x75, 0x14, 0xb6, 0xb2, 0x3b, 0x2d, 0x6b, 0x8c, 0x8b, 0xf9, 0x13, 0x39, 0x55, 0x53, - 0x89, 0xcd, 0x5f, 0xb9, 0x58, 0xf9, 0x44, 0x45, 0x1e, 0x9e, 0x37, 0x66, 0x3e, 0x0f, 0xec, 0xb6, - 0xf6, 0xee, 0x9e, 0xca, 0x49, 0x51, 0xb5, 0x97, 0x59, 0x2d, 0x3c, 0x6e, 0x48, 0xa4, 0x59, 0x0a, - 0x70, 0xae, 0x74, 0x49, 0x84, 0x45, 0x64, 0x30, 0xd7, 0x54, 0x9a, 0x91, 0x83, 0xdf, 0x9f, 0x6d, - 0xcd, 0x35, 0x19, 0xdb, 0x73, 0xad, 0x96, 0xc1, 0x7a, 0xa5, 0x42, 0x7b, 0xd9, 0xf3, 0xac, 0x39, - 0x39, 0x4f, 0xa6, 0x57, 0x51, 0xc2, 0xb6, 0xac, 0xbd, 0x47, 0x5c, 0x7c, 0xcf, 0xb2, 0xe7, 0x5b, - 0xfb, 0xac, 0xae, 0xf8, 0x8e, 0x3c, 0x64, 0x25, 0xcd, 0x8e, 0x1a, 0xe9, 0x55, 0xd4, 0xc2, 0x56, - 0x79, 0x19, 0xb8, 0x5e, 0x99, 0xe6, 0xb0, 0x73, 0xf7, 0x94, 0x14, 0x21, 0xed, 0x6d, 0x2f, 0xb0, - 0xe6, 0x0e, 0x4c, 0x85, 0x47, 0x55, 0xba, 0x5d, 0x49, 0xc2, 0x26, 0x6b, 0x01, 0x5a, 0x59, 0x35, - 0x8c, 0x34, 0x66, 0xef, 0x6b, 0x2d, 0x54, 0x48, 0x3d, 0x70, 0xa4, 0xeb, 0x7b, 0x54, 0xb6, 0x17, - 0x5a, 0xf3, 0x00, 0xf5, 0x7a, 0xf5, 0x2a, 0x8d, 0x47, 0x0c, 0x87, 0x89, 0x49, 0x72, 0xa3, 0x56, - 0x5e, 0x48, 0x3a, 0x22, 0x32, 0x2d, 0xb8, 0x55, 0x41, 0x47, 0x46, 0xcd, 0x1f, 0x85, 0xbe, 0x47, - 0x15, 0x7b, 0x91, 0x35, 0x6f, 0x9d, 0x53, 0xa9, 0x8b, 0x7e, 0x37, 0x94, 0xb4, 0x25, 0xc1, 0xed, - 0x1e, 0xbf, 0x52, 0xaf, 0x7a, 0xc3, 0x62, 0x8c, 0xb6, 0x73, 0x62, 0x73, 0x7a, 0xfc, 0xba, 0x27, - 0xe9, 0x9e, 0x56, 0x7b, 0xae, 0x35, 0x3b, 0x5f, 0xaf, 0xd2, 0xbd, 0xf8, 0xca, 0x4c, 0x94, 0xe9, - 0x3e, 0x7c, 0x0d, 0xb8, 0x1e, 0xdd, 0xaf, 0xbe, 0x9c, 0x49, 0x7a, 0xa0, 0x95, 0x7d, 0x56, 0xbb, - 0x41, 0x28, 0xe9, 0xc1, 0x56, 0x9b, 0xac, 0xf9, 0x7d, 0x81, 0x5f, 0xaf, 0xf5, 0xf8, 0x5e, 0xd1, - 0x91, 0xf4, 0x50, 0xab, 0xbd, 0xd8, 0xb2, 0x32, 0xe5, 0xf2, 0x4f, 0xba, 0x5d, 0x99, 0xf1, 0x4a, - 0xf4, 0x70, 0x2b, 0x87, 0xd4, 0xc0, 0x9a, 0x80, 0x1e, 0x89, 0x1b, 0xfc, 0xd8, 0x0f, 0xe8, 0x51, - 0x15, 0x57, 0x96, 0xe8, 0xb1, 0x56, 0x7b, 0x3e, 0x17, 0xb0, 0x54, 0x12, 0x13, 0xf4, 0x38, 0xfc, - 0x54, 0x63, 0xc8, 0xaf, 0xd1, 0x13, 0xf0, 0x53, 0xed, 0xbc, 0x53, 0xad, 0xd1, 0x2f, 0x60, 0xbd, - 0xce, 0x09, 0xb8, 0xf7, 0xc9, 0x56, 0x7b, 0x81, 0xb5, 0xcf, 0x3a, 0x27, 0x40, 0xd7, 0xb6, 0x56, - 0x7b, 0xa1, 0x35, 0x77, 0x9d, 0x13, 0xb8, 0x8e, 0x57, 0x14, 0xb4, 0x5d, 0xb9, 0x46, 0x13, 0x8e, - 0x36, 0x0e, 0x1e, 0xfc, 0x66, 0xd6, 0x5a, 0xd8, 0x34, 0x05, 0x79, 0x58, 0x7a, 0x9c, 0x50, 0xe6, - 0x3c, 0x99, 0x09, 0x73, 0x9e, 0xa4, 0xbd, 0x78, 0x58, 0x22, 0x64, 0x58, 0x38, 0x15, 0x4a, 0xd8, - 0xfb, 0x59, 0x8b, 0x23, 0x48, 0x8f, 0xf4, 0x2c, 0x7b, 0x89, 0x45, 0x11, 0x68, 0x06, 0x75, 0x76, - 0x93, 0x37, 0x86, 0xa6, 0xc5, 0x5e, 0x6a, 0xed, 0xdb, 0x30, 0x34, 0x63, 0x3d, 0xa7, 0xc9, 0x12, - 0xa3, 0xb6, 0xb7, 0x81, 0x38, 0xaa, 0x52, 0x63, 0xd9, 0xb6, 0xb5, 0xa8, 0x01, 0x41, 0xce, 0x7c, - 0x13, 0x59, 0x61, 0x5a, 0xcf, 0x02, 0x13, 0x46, 0xa1, 0x46, 0xd0, 0xc2, 0x66, 0x02, 0x28, 0x5a, - 0x64, 0xef, 0x6f, 0xd9, 0x31, 0x53, 0x23, 0x69, 0x71, 0xb3, 0x2d, 0x34, 0x91, 0x09, 0xa6, 0x09, - 0x95, 0xac, 0x25, 0x26, 0x58, 0x84, 0x42, 0xd9, 0x52, 0xbb, 0xd5, 0xda, 0xaf, 0x09, 0xd6, 0xe2, - 0xf6, 0xb7, 0x93, 0xd6, 0x92, 0xa6, 0x0e, 0xa3, 0xaf, 0x75, 0x06, 0x13, 0x24, 0x26, 0xed, 0xef, - 0x58, 0x4b, 0x9b, 0x1d, 0x8c, 0xca, 0xef, 0xcc, 0xf0, 0x80, 0xd0, 0x03, 0xcc, 0x20, 0xa9, 0x90, - 0x4a, 0xe7, 0x32, 0xa3, 0xde, 0x80, 0x90, 0xb9, 0xdc, 0xe4, 0x6f, 0x50, 0xad, 0xb2, 0xcd, 0xc8, - 0x37, 0xb8, 0x11, 0xb9, 0x62, 0x3a, 0x0d, 0x34, 0x1e, 0x68, 0x92, 0x8a, 0xcc, 0x8d, 0xc4, 0xf6, - 0xe9, 0xf6, 0x50, 0xf8, 0x5d, 0x33, 0xbc, 0xec, 0xad, 0xf4, 0x1d, 0x64, 0x2a, 0xae, 0x20, 0xa8, - 0xfb, 0x9e, 0x71, 0x56, 0x98, 0xd6, 0x76, 0xb0, 0xc9, 0x5a, 0xa1, 0x46, 0xd9, 0xf7, 0x9b, 0x09, - 0xa0, 0xeb, 0x1f, 0x4d, 0x7a, 0xda, 0xd4, 0xa8, 0xfa, 0xa7, 0x66, 0x5b, 0x68, 0xea, 0x8c, 0x8a, - 0xa9, 0xad, 0x94, 0xae, 0x95, 0x86, 0xa2, 0x01, 0x43, 0xdb, 0x21, 0xd1, 0x38, 0x46, 0xb8, 0xd6, - 0xb7, 0x2a, 0x1a, 0xb0, 0xa8, 0xc7, 0x68, 0x3c, 0x74, 0x26, 0x19, 0x74, 0xa6, 0xed, 0x03, 0xac, - 0xfd, 0xa7, 0xb9, 0x18, 0xad, 0x5d, 0x33, 0x7d, 0xa0, 0xf7, 0x9f, 0x4d, 0x0d, 0xb9, 0xa5, 0xb4, - 0xfe, 0x8b, 0x49, 0x4b, 0x41, 0xd0, 0xf9, 0xaf, 0xa6, 0x86, 0x0a, 0xd3, 0x1a, 0xff, 0xcd, 0x24, - 0xab, 0x50, 0xa3, 0xef, 0xdf, 0x9b, 0x09, 0xa0, 0xed, 0x3f, 0x4c, 0x7c, 0x6d, 0x6a, 0x74, 0x65, - 0x9a, 0x6d, 0xa1, 0xa9, 0x9b, 0x37, 0xc3, 0x1e, 0xdf, 0xa9, 0x88, 0xb0, 0x28, 0x58, 0xd1, 0xdb, - 0x6d, 0xf6, 0xbe, 0xd6, 0x02, 0x83, 0x40, 0xd0, 0x3b, 0x6d, 0xf6, 0x12, 0x6b, 0xb1, 0x81, 0x4c, - 0xe4, 0x77, 0xdb, 0xec, 0xfd, 0xac, 0x45, 0x06, 0xd5, 0x2a, 0xdf, 0x6b, 0xf2, 0x86, 0x9a, 0x3f, - 0xb5, 0xd9, 0x4b, 0x2d, 0x8a, 0xbc, 0x8d, 0x98, 0x3f, 0x37, 0x59, 0x42, 0xcb, 0xfb, 0x6d, 0x7c, - 0x00, 0xf5, 0x17, 0x58, 0x46, 0x89, 0xcf, 0xa5, 0xfe, 0x02, 0xe2, 0x0b, 0x3e, 0x1f, 0xfa, 0x0b, - 0x8d, 0xb3, 0x67, 0x81, 0x35, 0xb7, 0xbf, 0xa0, 0x23, 0x96, 0x95, 0x21, 0x42, 0x8d, 0xdb, 0x8b, - 0x2c, 0xab, 0xbf, 0x10, 0xc5, 0x70, 0x55, 0x1f, 0xc8, 0x8f, 0x00, 0x77, 0x2f, 0x73, 0x7b, 0x80, - 0x7b, 0xc1, 0xed, 0x83, 0xbb, 0xd7, 0x70, 0xd7, 0xc0, 0xdd, 0xab, 0xb9, 0x8f, 0x52, 0x86, 0xe0, - 0x0e, 0xc0, 0xdd, 0x1b, 0x71, 0x87, 0xaa, 0x0f, 0xdc, 0x92, 0xb9, 0xfb, 0xa0, 0x7b, 0x92, 0xe1, - 0x3e, 0xa5, 0x7b, 0x8a, 0xb9, 0xfb, 0x22, 0xdd, 0x47, 0x33, 0x77, 0x9f, 0xd1, 0xfd, 0xdf, 0xca, - 0x10, 0xdc, 0xff, 0xc3, 0xdc, 0x7d, 0x0d, 0xdd, 0xff, 0xab, 0xfa, 0xc0, 0xfd, 0x7f, 0xea, 0xb4, - 0x12, 0x8e, 0x14, 0xd8, 0x6e, 0xe9, 0x53, 0x14, 0xce, 0x20, 0x08, 0xf4, 0x19, 0x06, 0xc8, 0x40, - 0x26, 0xde, 0xe7, 0x18, 0x20, 0x83, 0xea, 0xb0, 0x5f, 0x34, 0x79, 0x23, 0xfa, 0x97, 0x6d, 0x7c, - 0xf2, 0xf4, 0x0b, 0xb5, 0x9d, 0xd3, 0x57, 0x6d, 0x7c, 0x88, 0xa1, 0x09, 0xf2, 0xaf, 0xe1, 0x81, - 0xb6, 0x61, 0xfe, 0xa6, 0x8d, 0x45, 0x01, 0xd2, 0xb4, 0x7f, 0x6b, 0x38, 0x81, 0xf3, 0x98, 0x15, - 0x6c, 0x91, 0xf3, 0xa4, 0x08, 0x26, 0x9c, 0x0a, 0xd3, 0x1e, 0xbb, 0x82, 0x69, 0x0c, 0x02, 0xe6, - 0xe3, 0x56, 0xf0, 0xa9, 0xdc, 0x87, 0x31, 0x39, 0x2e, 0xc1, 0x27, 0x63, 0x9f, 0x1a, 0x94, 0xe3, - 0x71, 0xe4, 0xf7, 0x45, 0xa3, 0x72, 0x42, 0x82, 0x15, 0xf6, 0x99, 0x61, 0x39, 0x51, 0xdb, 0x22, - 0xd2, 0x49, 0x09, 0x3e, 0x28, 0xfb, 0x1a, 0x03, 0x73, 0xb2, 0xee, 0x45, 0xf5, 0x4e, 0xc1, 0x65, - 0xa1, 0x77, 0x2d, 0x87, 0x38, 0x03, 0x1d, 0xbd, 0x6b, 0x11, 0xe2, 0x4c, 0x84, 0xe8, 0x5d, 0x6b, - 0x42, 0x9c, 0x85, 0x10, 0xbd, 0x6b, 0x75, 0x88, 0x0d, 0xda, 0x16, 0x21, 0x36, 0x22, 0x44, 0xef, - 0xda, 0x28, 0xc4, 0x26, 0xdd, 0x8b, 0x10, 0x67, 0x23, 0xc4, 0x20, 0xb2, 0xd8, 0x8c, 0x8e, 0x41, - 0x95, 0x85, 0xba, 0xb8, 0x0c, 0x46, 0x59, 0x6c, 0x45, 0x88, 0x41, 0x93, 0xc5, 0xf9, 0xda, 0x16, - 0x21, 0x2e, 0x40, 0x88, 0xc1, 0x46, 0x16, 0x17, 0xea, 0x5e, 0x84, 0xb8, 0x48, 0x31, 0xd5, 0x2b, - 0x15, 0x95, 0xc9, 0x65, 0xca, 0x1a, 0x6d, 0x84, 0xba, 0x3c, 0x61, 0xdb, 0xd6, 0x42, 0x05, 0x98, - 0x70, 0x57, 0x24, 0xb8, 0xe0, 0x0a, 0xd3, 0x21, 0xaf, 0x8c, 0xf9, 0x21, 0xec, 0x55, 0x7c, 0x3b, - 0x58, 0xa4, 0xfd, 0x4c, 0xe8, 0xab, 0x63, 0x56, 0x08, 0x7f, 0x0d, 0x84, 0x0f, 0x55, 0xea, 0x6a, - 0x7f, 0xda, 0x96, 0xe0, 0xb1, 0xe5, 0xa6, 0x09, 0xb5, 0x3d, 0xc1, 0x37, 0x19, 0x46, 0x58, 0xdd, - 0xd3, 0x50, 0x3b, 0xe0, 0x7a, 0xda, 0xfe, 0x19, 0x08, 0x41, 0xdb, 0x38, 0x3c, 0x0b, 0x46, 0x40, - 0xec, 0xf1, 0xbc, 0xb2, 0xa8, 0x57, 0xa4, 0x5b, 0xab, 0x4c, 0xc1, 0xe9, 0x85, 0x04, 0x4f, 0x69, - 0x03, 0x19, 0xbf, 0x17, 0x11, 0xda, 0xa0, 0xec, 0xfa, 0x4b, 0x88, 0xcd, 0xba, 0x13, 0x6e, 0x49, - 0x6d, 0x56, 0x2f, 0xa1, 0x14, 0x0a, 0x30, 0x6e, 0x2f, 0x27, 0xf4, 0xdc, 0x53, 0x30, 0xfb, 0xbd, - 0x92, 0xe0, 0x5d, 0x29, 0x82, 0x8c, 0xe5, 0x0e, 0x64, 0x32, 0xe0, 0x97, 0xc0, 0xb5, 0x13, 0xe4, - 0x03, 0x7e, 0xc9, 0x74, 0xef, 0xc2, 0xa8, 0x0c, 0xf8, 0x25, 0xa6, 0xd8, 0x9d, 0xb0, 0x93, 0xd6, - 0x7e, 0x31, 0x31, 0x23, 0x5e, 0xe8, 0x96, 0x3d, 0x51, 0xa2, 0x57, 0x61, 0x96, 0x19, 0x45, 0x72, - 0x77, 0x10, 0x53, 0x66, 0x46, 0xc3, 0x11, 0x6e, 0xdd, 0x69, 0x5a, 0x08, 0x70, 0x17, 0xe1, 0x62, - 0x39, 0x1a, 0x15, 0xe6, 0x6e, 0xc2, 0xae, 0x28, 0x5c, 0x5e, 0x33, 0x05, 0x3f, 0x2b, 0x8a, 0x74, - 0x4f, 0x33, 0xc4, 0x24, 0xf7, 0x46, 0x50, 0x56, 0x14, 0x15, 0x74, 0x5f, 0x33, 0xc4, 0x8e, 0xf7, - 0x13, 0x17, 0x99, 0x21, 0xc4, 0x7a, 0x80, 0xb8, 0x30, 0xab, 0x2b, 0xbe, 0x1f, 0x44, 0xdc, 0x0f, - 0x4e, 0xc3, 0x98, 0xe9, 0xa1, 0x06, 0x16, 0xb1, 0x3f, 0x3c, 0x0d, 0x63, 0xdf, 0x47, 0x88, 0x87, - 0x19, 0x18, 0xf8, 0x1f, 0x45, 0x7b, 0xd8, 0xaf, 0x7b, 0xaa, 0x78, 0xdb, 0x11, 0x1e, 0x6d, 0xa6, - 0x78, 0xaa, 0xd1, 0x64, 0xef, 0xa7, 0xc9, 0xde, 0xdf, 0xda, 0x17, 0xcd, 0xc3, 0x5d, 0x39, 0xbe, - 0x3a, 0x70, 0x8a, 0x6a, 0xb2, 0x10, 0x8f, 0x4b, 0x13, 0xce, 0xde, 0xcf, 0xce, 0x84, 0x99, 0xe5, - 0x39, 0x54, 0xb3, 0xdf, 0x2f, 0xff, 0x30, 0x13, 0x94, 0xe9, 0x25, 0x84, 0xe8, 0xf7, 0xcb, 0x2b, - 0x33, 0x41, 0x39, 0xa4, 0x97, 0xc9, 0x9e, 0x67, 0xb5, 0x70, 0x93, 0x5e, 0x21, 0x5e, 0xa3, 0x6c, - 0xf7, 0x03, 0xda, 0x01, 0x78, 0xd8, 0xf1, 0x4a, 0xb4, 0x13, 0x45, 0xe3, 0x4f, 0x26, 0xcd, 0x0b, - 0x51, 0xa2, 0x5d, 0xc4, 0x37, 0xfb, 0x21, 0x7f, 0x3d, 0xed, 0x86, 0x5d, 0x8f, 0xef, 0x4d, 0xd0, - 0xab, 0x70, 0xef, 0x19, 0xee, 0x39, 0x64, 0x25, 0xbd, 0x06, 0x38, 0xef, 0x96, 0x3d, 0x7a, 0x5d, - 0x7d, 0x1e, 0x15, 0x48, 0xfa, 0x15, 0x3e, 0x33, 0x45, 0x3f, 0xa4, 0x37, 0xd4, 0x67, 0xe8, 0x7a, - 0xf4, 0x6b, 0x08, 0xca, 0x48, 0xc7, 0x83, 0xbe, 0x37, 0x51, 0x21, 0x6e, 0x2a, 0x81, 0xbf, 0x41, - 0xac, 0x1e, 0x3f, 0xa4, 0x3d, 0xfa, 0x4b, 0xd2, 0x5b, 0xc8, 0x28, 0x2b, 0xca, 0x81, 0x10, 0x21, - 0xfd, 0x16, 0x78, 0xef, 0x64, 0x8d, 0x7e, 0x47, 0xf6, 0x3e, 0xd6, 0xac, 0xa1, 0x1c, 0xfd, 0x1e, - 0x06, 0xc3, 0x4e, 0xc9, 0x75, 0xbc, 0x90, 0xfe, 0x00, 0x83, 0xbc, 0xeb, 0xd1, 0x1f, 0xf1, 0x55, - 0x70, 0x3c, 0x7a, 0x9b, 0x78, 0x91, 0x14, 0x82, 0x3a, 0x3f, 0x6e, 0x30, 0xd9, 0xdf, 0x41, 0x9e, - 0x06, 0x41, 0x9d, 0xdf, 0xe5, 0xbb, 0xf1, 0x62, 0x03, 0x99, 0xe9, 0xf7, 0x1e, 0xe6, 0x63, 0xbf, - 0x5f, 0x76, 0x8b, 0x4e, 0x85, 0x5f, 0x42, 0x17, 0x27, 0xb1, 0xaf, 0x2b, 0x60, 0x4d, 0x40, 0x97, - 0x24, 0x63, 0x06, 0xfc, 0x12, 0xba, 0x34, 0xc9, 0x29, 0x8e, 0x78, 0x4e, 0x30, 0x35, 0xe8, 0x4b, - 0xba, 0x2c, 0xc9, 0x13, 0x05, 0xcd, 0x68, 0x75, 0x5f, 0x95, 0xe4, 0x4d, 0xa6, 0x81, 0x21, 0xfe, - 0xd5, 0x49, 0x1e, 0xff, 0x06, 0x68, 0x14, 0x5c, 0x03, 0x02, 0xdd, 0xca, 0x85, 0x78, 0xd4, 0x5e, - 0x0b, 0x02, 0xb3, 0x3f, 0x69, 0xf0, 0xa7, 0x50, 0xc2, 0x5c, 0x1a, 0xb8, 0x2e, 0xc9, 0x49, 0xaa, - 0x9d, 0x4e, 0x43, 0xd7, 0xc3, 0x86, 0x77, 0x3a, 0x0d, 0xdc, 0x80, 0x74, 0x72, 0x9e, 0xd4, 0xed, - 0x1b, 0x61, 0xc0, 0x9b, 0x9c, 0x06, 0x6e, 0x82, 0x81, 0x7a, 0x06, 0xe6, 0xdd, 0x32, 0xdd, 0x8c, - 0xf4, 0xf0, 0x0a, 0xe4, 0xe6, 0x2d, 0xa6, 0xfb, 0xc7, 0x3e, 0xda, 0xb7, 0x9a, 0xf6, 0xa0, 0x28, - 0x73, 0xfb, 0xb6, 0x06, 0x7f, 0x21, 0xa8, 0x0b, 0xba, 0x3d, 0x26, 0x12, 0xc0, 0xcf, 0x9a, 0xd3, - 0x03, 0xf6, 0x73, 0x18, 0xc1, 0x69, 0xb5, 0x53, 0x09, 0x05, 0xdd, 0x91, 0xe4, 0x01, 0x54, 0x5e, - 0x0a, 0xb9, 0x53, 0x55, 0xc0, 0xb8, 0x29, 0xf0, 0x2e, 0x35, 0x36, 0x62, 0x4c, 0xe6, 0xc7, 0xdd, - 0x31, 0x49, 0xf7, 0xa8, 0x60, 0x6e, 0x79, 0x5c, 0x03, 0xf7, 0x1a, 0xf1, 0xea, 0xb1, 0x7c, 0x37, - 0x48, 0xfa, 0x84, 0x1c, 0x72, 0x02, 0xa7, 0xaa, 0x8f, 0x84, 0xfb, 0x92, 0x38, 0x2d, 0x85, 0x5c, - 0xe7, 0x04, 0x74, 0x3f, 0x1a, 0xc3, 0xfe, 0x7a, 0xce, 0xe5, 0x01, 0x34, 0xf2, 0xaa, 0xe7, 0x41, - 0xe8, 0xc6, 0xa3, 0x3c, 0x1a, 0xaa, 0x87, 0xc0, 0xa7, 0x31, 0x73, 0x78, 0x3c, 0x9c, 0x8c, 0x5e, - 0xef, 0x18, 0xfc, 0x47, 0x20, 0x4a, 0xb5, 0x7f, 0x94, 0x5f, 0x33, 0x48, 0x8f, 0xc6, 0x00, 0xcc, - 0x84, 0xc7, 0x30, 0x6e, 0x0a, 0xd0, 0xa2, 0x1e, 0x8f, 0xd9, 0xe0, 0x9c, 0x7a, 0x22, 0xc9, 0x0b, - 0x30, 0xe7, 0x31, 0xe3, 0xe5, 0xcb, 0x59, 0x57, 0xce, 0x83, 0xf3, 0x15, 0xcb, 0x55, 0xc1, 0x8d, - 0xa6, 0x2b, 0x97, 0x73, 0xca, 0x39, 0x4f, 0x13, 0x5d, 0xa5, 0x6d, 0x41, 0x72, 0xf5, 0x72, 0x55, - 0xe7, 0x48, 0xeb, 0x35, 0xba, 0x17, 0x87, 0xdc, 0xb5, 0x8a, 0x69, 0x8c, 0xa7, 0x01, 0x87, 0x39, - 0xb1, 0x0d, 0xd6, 0x68, 0x23, 0xd4, 0x49, 0x6d, 0x5c, 0x02, 0x05, 0x98, 0x70, 0x27, 0xe3, 0x6e, - 0xa4, 0x30, 0x1d, 0xf2, 0x94, 0x98, 0x1f, 0xc2, 0x9e, 0x8a, 0x6b, 0x98, 0xf6, 0x33, 0xa1, 0x4f, - 0x6b, 0x43, 0x42, 0x63, 0x1c, 0xe9, 0xf4, 0x36, 0xc8, 0x18, 0x43, 0x94, 0x33, 0xda, 0x94, 0x0c, - 0x13, 0xe1, 0x4c, 0x5c, 0xce, 0x72, 0x63, 0x9a, 0xfd, 0x2c, 0x6d, 0x0b, 0xe6, 0x0d, 0x3a, 0x54, - 0xc4, 0xba, 0x31, 0x16, 0x1b, 0x49, 0x6d, 0xd2, 0xe6, 0xea, 0xa2, 0x82, 0x5b, 0x5b, 0x8f, 0x13, - 0x8a, 0xc3, 0xc7, 0x05, 0x4a, 0xf9, 0x17, 0x75, 0x07, 0xd7, 0x08, 0xe2, 0x7f, 0xa0, 0xee, 0xfa, - 0x1a, 0x32, 0x2a, 0xfe, 0xaa, 0xee, 0xfa, 0x1a, 0xd5, 0x5a, 0x3e, 0x6c, 0xf2, 0x86, 0xa2, 0x8f, - 0xd4, 0x5d, 0xdf, 0x78, 0x1b, 0x5d, 0x1f, 0x37, 0x59, 0x42, 0xcc, 0x27, 0x90, 0x9a, 0xc1, 0x6c, - 0x0a, 0xa6, 0x6a, 0x92, 0xce, 0x6b, 0xd7, 0x40, 0xaf, 0xa7, 0x80, 0xcd, 0xed, 0x38, 0xbe, 0xfc, - 0x2a, 0x7e, 0xd5, 0xa4, 0x2d, 0xed, 0xf8, 0x31, 0x27, 0x7b, 0x28, 0x6d, 0x45, 0xc7, 0x90, 0x13, - 0x86, 0xeb, 0xfd, 0xa0, 0x44, 0xe7, 0xb7, 0x63, 0xb5, 0x38, 0x5e, 0xc9, 0xaf, 0xaa, 0x1f, 0xaf, - 0x2e, 0x68, 0xc7, 0xbe, 0x7c, 0x58, 0xe6, 0x87, 0x74, 0xa1, 0xf9, 0x5c, 0x49, 0x17, 0x21, 0xc0, - 0x88, 0x57, 0x34, 0x8c, 0x17, 0xb7, 0xdb, 0xad, 0x96, 0xdd, 0x00, 0x44, 0xa9, 0x5f, 0x78, 0x65, - 0x39, 0x4e, 0x97, 0x20, 0x40, 0xd6, 0x91, 0xce, 0xa8, 0x13, 0x0a, 0xba, 0xae, 0x1d, 0x07, 0x1d, - 0x0e, 0x36, 0x7f, 0x7d, 0x48, 0xd7, 0x23, 0x60, 0x4f, 0x3d, 0x08, 0x84, 0x27, 0x47, 0x42, 0x11, - 0xd0, 0x0d, 0x88, 0x82, 0xcf, 0x1b, 0xdb, 0xd5, 0xb3, 0xc6, 0xf3, 0x44, 0x11, 0xbb, 0x55, 0x96, - 0x6e, 0x02, 0xd4, 0x8f, 0xeb, 0x75, 0x28, 0x02, 0x99, 0xcb, 0xd2, 0xcd, 0x08, 0x1d, 0x87, 0xf8, - 0x00, 0xca, 0x65, 0xe9, 0x96, 0x76, 0xfc, 0x26, 0x24, 0x82, 0x90, 0xeb, 0x76, 0x2b, 0x22, 0x15, - 0xdc, 0x6c, 0xb7, 0x41, 0x6e, 0x6b, 0x57, 0xa7, 0xe8, 0x7a, 0xb5, 0xa4, 0x6f, 0x6f, 0xe7, 0x69, - 0x94, 0xaf, 0x08, 0x51, 0xa3, 0x27, 0xdb, 0xd5, 0x71, 0x57, 0x3c, 0x92, 0xb6, 0xa9, 0x92, 0x88, - 0x8a, 0x70, 0x42, 0x01, 0x64, 0x3b, 0xbf, 0xea, 0x17, 0x9b, 0x1f, 0x1d, 0xbc, 0x29, 0xac, 0x2d, - 0x7a, 0xaa, 0x9d, 0x87, 0x2b, 0x7a, 0xa5, 0x1a, 0xf8, 0xe9, 0x76, 0x7d, 0x79, 0x8f, 0x90, 0x67, - 0x90, 0x02, 0xaf, 0xdf, 0x08, 0x7a, 0x16, 0x10, 0x7e, 0x6c, 0x31, 0xd0, 0x73, 0xed, 0x3c, 0x4b, - 0xf4, 0xcf, 0x06, 0x06, 0x7c, 0x1e, 0x76, 0x78, 0xb5, 0x1b, 0xe8, 0x85, 0x76, 0xb5, 0x48, 0x85, - 0xcc, 0x48, 0xdf, 0xa3, 0x17, 0xa3, 0xe6, 0xa0, 0xf4, 0x1d, 0xfa, 0x65, 0xbb, 0x5a, 0xd2, 0x42, - 0xa6, 0xd1, 0xfd, 0x52, 0xa3, 0x8d, 0xfe, 0x97, 0xdb, 0x31, 0xa7, 0xc3, 0xdc, 0xd0, 0xc4, 0x2a, - 0x7a, 0x05, 0xec, 0xaa, 0xc1, 0x53, 0xc5, 0x91, 0xb4, 0x23, 0x06, 0x0d, 0x38, 0xb5, 0x9a, 0x28, - 0xd1, 0xce, 0x86, 0x4b, 0x9a, 0x76, 0xa9, 0xc1, 0x1a, 0xc9, 0x65, 0x69, 0x37, 0xaa, 0xdd, 0xef, - 0x1e, 0x29, 0x78, 0xc3, 0xdb, 0xb1, 0x82, 0x6b, 0x34, 0x2c, 0xca, 0x62, 0xb2, 0xd6, 0xed, 0xf2, - 0xc9, 0xc4, 0xe8, 0xce, 0x15, 0xb8, 0xd6, 0x00, 0xe5, 0xf6, 0xae, 0x15, 0x9c, 0x24, 0xcf, 0xe1, - 0xde, 0x49, 0x19, 0x38, 0x45, 0xc9, 0xe0, 0xa9, 0x1d, 0x06, 0x1c, 0xf1, 0x8e, 0xaa, 0xfb, 0x12, - 0x7c, 0xa7, 0x75, 0x70, 0x19, 0x19, 0x2c, 0x4c, 0xd5, 0x80, 0x9c, 0xde, 0x61, 0x8e, 0x9b, 0xbc, - 0x80, 0xdf, 0x19, 0x1d, 0xbc, 0xa7, 0xe0, 0xfc, 0xc1, 0x3c, 0x60, 0xec, 0xcc, 0x88, 0x6b, 0x58, - 0xd4, 0x2a, 0x4e, 0x11, 0x9e, 0x67, 0x45, 0x86, 0xc3, 0xa2, 0xea, 0x4f, 0x00, 0xdb, 0xd0, 0x81, - 0x41, 0x09, 0x7d, 0x6f, 0x40, 0x04, 0x65, 0x40, 0x1b, 0x23, 0xb3, 0x35, 0xa3, 0x47, 0x08, 0xa5, - 0x6d, 0x53, 0x64, 0x96, 0x09, 0x02, 0x07, 0x39, 0x9d, 0x1d, 0x41, 0xeb, 0x9c, 0x8a, 0x8b, 0x83, - 0xee, 0x9c, 0x0e, 0x4e, 0x9e, 0xa1, 0x1e, 0xdf, 0x93, 0x8e, 0xeb, 0x85, 0x8c, 0x9e, 0xdb, 0xc1, - 0xf3, 0x34, 0xf2, 0xcd, 0xd4, 0x6a, 0x42, 0x9d, 0x8b, 0xe7, 0x35, 0x77, 0x34, 0xd4, 0x6f, 0xee, - 0xe0, 0x73, 0x3d, 0x12, 0x35, 0xe4, 0xc8, 0xe2, 0x38, 0xe3, 0x5b, 0x3a, 0xec, 0xef, 0x58, 0x4b, - 0x1a, 0x78, 0x20, 0x42, 0x11, 0xa8, 0x3c, 0xb6, 0x76, 0xf0, 0x3d, 0x3a, 0x1e, 0x7a, 0xc8, 0x91, - 0x70, 0x3a, 0x3f, 0x4a, 0x67, 0x28, 0x10, 0x52, 0x42, 0xfb, 0x05, 0x91, 0xf6, 0xb5, 0xa6, 0xd0, - 0x17, 0x46, 0x66, 0x79, 0xe1, 0x04, 0x2a, 0xde, 0x45, 0x91, 0xc0, 0xbc, 0xf4, 0x03, 0x87, 0xcb, - 0x73, 0x34, 0x8c, 0x2f, 0x8e, 0xfc, 0xb3, 0xa2, 0xa6, 0xc2, 0x5c, 0x12, 0x0d, 0xd4, 0x7f, 0x8a, - 0x29, 0xe4, 0x7d, 0x69, 0xc4, 0xa8, 0xb6, 0x04, 0xc6, 0x2e, 0x03, 0x96, 0x75, 0xa4, 0x58, 0xed, - 0x07, 0x55, 0x07, 0xd9, 0x7e, 0xd0, 0xc9, 0x9e, 0x8c, 0xf5, 0xbb, 0x52, 0x04, 0xbc, 0x53, 0x76, - 0xea, 0xbd, 0x43, 0x64, 0xdd, 0xb1, 0x31, 0xfa, 0xb0, 0xd3, 0x3c, 0xc2, 0x78, 0x05, 0x00, 0xfa, - 0xa8, 0x93, 0x95, 0x71, 0x53, 0xad, 0x94, 0xa8, 0xe3, 0xe3, 0x4e, 0xfb, 0xef, 0xac, 0xfd, 0xcd, - 0x6a, 0x9c, 0xd6, 0xf9, 0x49, 0xa7, 0xfd, 0xf7, 0x56, 0xd2, 0x74, 0x9a, 0x7f, 0xa3, 0xee, 0x4f, - 0x41, 0xda, 0xf0, 0x89, 0x3a, 0x3e, 0x03, 0xa9, 0xea, 0x98, 0xe1, 0xf5, 0x79, 0x27, 0x0f, 0x8a, - 0xea, 0x9c, 0x16, 0xef, 0x8b, 0x4e, 0xde, 0x1a, 0x0c, 0x55, 0x04, 0x7f, 0xd9, 0xc9, 0x8b, 0x87, - 0xd3, 0xa3, 0xaf, 0xf0, 0x79, 0x98, 0x5f, 0x0f, 0xe8, 0xeb, 0x4e, 0x3c, 0x8b, 0x5c, 0xaf, 0x2e, - 0x05, 0x7d, 0xd3, 0xa9, 0xee, 0x0d, 0x45, 0xdf, 0x2b, 0xd1, 0xdf, 0x50, 0xa0, 0x01, 0xb7, 0x18, - 0xf8, 0x1a, 0x39, 0x26, 0xc5, 0x5b, 0xd6, 0x80, 0xef, 0xc9, 0x71, 0x3a, 0x36, 0x85, 0x97, 0x22, - 0x7f, 0x0f, 0x3a, 0x55, 0x41, 0xc7, 0xa5, 0xf0, 0xf2, 0xf4, 0xd7, 0xf3, 0x6e, 0xc8, 0x37, 0xe6, - 0xe3, 0x53, 0x78, 0xd7, 0x2a, 0xc0, 0xaf, 0x4b, 0xc6, 0x4e, 0x48, 0xe1, 0x86, 0xec, 0x4c, 0xc1, - 0xe5, 0x44, 0xb8, 0x64, 0x9d, 0xa9, 0x35, 0x63, 0x8a, 0xf3, 0x24, 0x70, 0x02, 0x38, 0x5c, 0x88, - 0x23, 0xe9, 0xe4, 0x46, 0xfb, 0xbf, 0x84, 0x13, 0xd0, 0x29, 0x29, 0x1e, 0x11, 0xee, 0x62, 0xce, - 0x01, 0xbf, 0x24, 0xe8, 0xd4, 0x14, 0xcf, 0x7d, 0x03, 0xf9, 0x75, 0x09, 0xf4, 0x34, 0xc4, 0x61, - 0x34, 0xeb, 0x4c, 0xd1, 0xe9, 0x88, 0xc3, 0x2d, 0xcd, 0x73, 0x46, 0x8a, 0xd3, 0xc7, 0xe7, 0x99, - 0x29, 0xae, 0x15, 0x7f, 0x36, 0xd1, 0x9e, 0x95, 0xe2, 0x79, 0x1d, 0x87, 0x0d, 0xf5, 0x06, 0x68, - 0xea, 0x13, 0x52, 0xcd, 0x24, 0xda, 0x98, 0xc2, 0xc6, 0x39, 0x15, 0x72, 0x61, 0xf1, 0xbe, 0x09, - 0x6b, 0xb4, 0x29, 0xc5, 0x2b, 0x29, 0x06, 0xfa, 0x75, 0xc9, 0xf8, 0xd9, 0xa9, 0xd8, 0xf1, 0x83, - 0x91, 0x38, 0x07, 0xfa, 0x35, 0xc2, 0x43, 0xf5, 0x03, 0xae, 0xd3, 0xb9, 0xd3, 0x51, 0xbc, 0x41, - 0xce, 0x83, 0x6c, 0x1c, 0xd6, 0x9b, 0x53, 0xea, 0x74, 0xa9, 0x46, 0x93, 0x77, 0x0b, 0x52, 0x1e, - 0x29, 0xf4, 0x80, 0x76, 0x2b, 0xf4, 0x8f, 0x14, 0x7a, 0xd8, 0x24, 0x94, 0x4e, 0xb5, 0x66, 0x86, - 0xe5, 0xfc, 0x14, 0x4f, 0xaa, 0xe9, 0x3d, 0x7a, 0x7c, 0x2e, 0x40, 0x67, 0xa6, 0x54, 0x62, 0x12, - 0x89, 0x7d, 0xbf, 0xd4, 0xf8, 0x59, 0x23, 0xc5, 0x33, 0xae, 0xb9, 0x53, 0x5f, 0x27, 0x2e, 0x42, - 0xb8, 0x4c, 0xa9, 0x84, 0xc9, 0xe6, 0x48, 0x4c, 0x3a, 0x5c, 0xca, 0x2f, 0x36, 0x4e, 0xe6, 0x68, - 0x69, 0xf0, 0x5d, 0x92, 0xe2, 0x79, 0x1f, 0xef, 0xd2, 0x6c, 0x97, 0xa2, 0x7a, 0x9a, 0x4d, 0x61, - 0xe0, 0xba, 0x2c, 0x52, 0x17, 0x9d, 0x7a, 0x0d, 0xb6, 0xcb, 0x23, 0x75, 0x8d, 0x4e, 0xcd, 0x77, - 0x45, 0x93, 0x3a, 0xdd, 0x0d, 0xc6, 0x2b, 0x8d, 0x04, 0xd6, 0x1c, 0x67, 0xbb, 0x0a, 0xd3, 0xa2, - 0xd1, 0xa1, 0x99, 0xae, 0x86, 0x82, 0x7c, 0x7d, 0xf4, 0xdb, 0xea, 0x73, 0x0d, 0x14, 0x34, 0x77, - 0x6a, 0xbf, 0x6b, 0xa1, 0x20, 0x5f, 0x1f, 0x9d, 0x51, 0x9f, 0x9f, 0x1a, 0xa7, 0x99, 0xf5, 0xb9, - 0x0e, 0xe2, 0xe2, 0x5d, 0x9a, 0xed, 0x7a, 0x35, 0xbb, 0x14, 0x5b, 0xac, 0x3e, 0x37, 0x44, 0xea, - 0xbe, 0xa5, 0x3e, 0x37, 0x46, 0xea, 0x66, 0xd4, 0xe7, 0xa6, 0x26, 0x75, 0xf1, 0xfa, 0xdc, 0x6c, - 0x24, 0x4c, 0xaf, 0xcf, 0x2d, 0xa8, 0x4f, 0xa3, 0x43, 0x33, 0xdd, 0x8a, 0x20, 0x23, 0x9e, 0x3b, - 0x19, 0xcd, 0x2e, 0x3d, 0x89, 0xe9, 0x36, 0x78, 0x34, 0x75, 0xf1, 0x35, 0xf6, 0xf6, 0x99, 0x70, - 0x56, 0x14, 0xe9, 0x67, 0x29, 0xf5, 0x1f, 0x87, 0xde, 0x84, 0x08, 0x64, 0xe1, 0x68, 0xfa, 0x79, - 0x0a, 0x3f, 0x3a, 0x39, 0x47, 0xa2, 0x7a, 0x74, 0x47, 0xd4, 0xc4, 0x6a, 0xb8, 0x13, 0xd6, 0x43, - 0x22, 0x70, 0xfd, 0x52, 0xa6, 0x54, 0xa2, 0xbb, 0xb0, 0xe0, 0x55, 0x1b, 0x5b, 0xdf, 0xdd, 0x58, - 0x1c, 0x6b, 0xeb, 0x4e, 0x20, 0x45, 0x40, 0xf7, 0xc0, 0x3c, 0x2f, 0x8a, 0x05, 0x1f, 0xee, 0xf7, - 0xa2, 0x8d, 0xbd, 0x92, 0x77, 0x3a, 0xba, 0x2f, 0x65, 0xae, 0x3d, 0xd0, 0xc3, 0x8c, 0xf7, 0xa7, - 0x78, 0x63, 0x2c, 0xf8, 0x59, 0x67, 0x2a, 0xa4, 0x07, 0x94, 0xbd, 0xde, 0x15, 0x43, 0x7a, 0x10, - 0x5b, 0x80, 0x5e, 0x52, 0x66, 0x9d, 0x3d, 0x84, 0x41, 0x8a, 0x81, 0x7a, 0x89, 0x3d, 0x8c, 0x6d, - 0x31, 0x22, 0xc7, 0xc2, 0x7e, 0x04, 0x04, 0x11, 0xa6, 0x7e, 0x61, 0x78, 0x34, 0x65, 0x76, 0x71, - 0x80, 0x66, 0x9d, 0x3f, 0x86, 0x54, 0xf8, 0xfa, 0xc9, 0x5b, 0xdb, 0xe3, 0x60, 0xcb, 0xcb, 0x80, - 0xa5, 0x49, 0x55, 0x9c, 0x27, 0xd4, 0xf4, 0x88, 0x63, 0x3c, 0x1b, 0xe9, 0x17, 0xd3, 0x70, 0x33, - 0x96, 0x4f, 0x22, 0xd0, 0xea, 0xc0, 0xaf, 0x9a, 0x61, 0x80, 0xa8, 0x6d, 0x33, 0x60, 0xd6, 0x45, - 0xdb, 0xb1, 0x35, 0xe9, 0xfb, 0x53, 0xc4, 0xfd, 0x54, 0x13, 0x6a, 0x98, 0x9f, 0x36, 0x0b, 0x8f, - 0xed, 0xe2, 0x47, 0x15, 0x3d, 0x13, 0x5f, 0x5f, 0xfa, 0xdd, 0xef, 0x49, 0x7a, 0x36, 0xbe, 0xc5, - 0xe8, 0x83, 0x4f, 0x3f, 0x63, 0x9e, 0x8b, 0x7b, 0xe4, 0x3c, 0xf3, 0xe3, 0xf5, 0xf3, 0x28, 0x40, - 0x03, 0x66, 0x96, 0x17, 0x52, 0xf6, 0x01, 0xd6, 0x52, 0x8d, 0x19, 0x89, 0xda, 0xfe, 0xc5, 0xf8, - 0x8a, 0x37, 0x7d, 0xf8, 0x31, 0xd2, 0x2c, 0x82, 0x19, 0x5a, 0x5f, 0x8a, 0xcf, 0xf5, 0x86, 0xd6, - 0x97, 0xe3, 0xcb, 0xbd, 0x59, 0xeb, 0x2b, 0x71, 0x8f, 0x86, 0xd6, 0x1d, 0x6a, 0xb0, 0x22, 0x98, - 0x59, 0x76, 0x42, 0xab, 0xc6, 0xa6, 0x69, 0xdd, 0x15, 0x5f, 0x7d, 0x71, 0xad, 0xbb, 0x31, 0xfd, - 0x79, 0x68, 0x30, 0x1f, 0x5f, 0x4d, 0x99, 0x9f, 0x4a, 0xf4, 0x99, 0xf4, 0x5a, 0xf3, 0x1c, 0xc3, - 0x12, 0x78, 0x3d, 0xa5, 0x7f, 0xee, 0xd0, 0x0f, 0xa5, 0xdd, 0x69, 0x7e, 0x93, 0x75, 0xbb, 0x1e, - 0xbd, 0x9a, 0xe6, 0x53, 0x3d, 0x93, 0xef, 0xc9, 0xe5, 0xe8, 0xb5, 0x34, 0x7e, 0x38, 0x1b, 0x77, - 0x02, 0x7a, 0x3d, 0xcd, 0xac, 0xfc, 0xa9, 0x3d, 0x7e, 0x95, 0xe6, 0x35, 0xa0, 0xff, 0xdf, 0xfd, - 0x8d, 0xb4, 0x7a, 0xe1, 0x71, 0xe3, 0xf0, 0x3c, 0xfd, 0x3a, 0xcd, 0xb3, 0x52, 0xaf, 0x57, 0x7a, - 0x13, 0xdc, 0xbd, 0x15, 0x49, 0xbf, 0x49, 0xb3, 0x92, 0xde, 0xc9, 0x9a, 0x1f, 0xc8, 0xbc, 0x90, - 0x87, 0xf0, 0x0c, 0xda, 0xd3, 0x8c, 0xad, 0x62, 0xec, 0xad, 0x66, 0xec, 0x50, 0xc6, 0x7e, 0x8b, - 0x10, 0xf8, 0x1b, 0x0c, 0x4e, 0xfa, 0x77, 0x69, 0x3c, 0xe5, 0xb8, 0x89, 0xd7, 0xee, 0xef, 0xd3, - 0x7c, 0x04, 0xa2, 0xad, 0xeb, 0xf5, 0x07, 0x6d, 0xe1, 0x95, 0x72, 0x7c, 0x49, 0xa7, 0x3f, 0x42, - 0xb0, 0xae, 0xc9, 0xdb, 0x69, 0x4c, 0x67, 0x34, 0x78, 0x39, 0xf6, 0xfb, 0x45, 0xa7, 0x22, 0xe8, - 0x1d, 0x64, 0xc9, 0xa5, 0xec, 0x76, 0x42, 0x91, 0x5e, 0x45, 0xef, 0x82, 0xe4, 0x30, 0x31, 0xc9, - 0x6f, 0xa8, 0xa0, 0x4c, 0xef, 0x99, 0x76, 0x5e, 0x06, 0xdc, 0xfe, 0x53, 0x5a, 0xfd, 0xf0, 0xc0, - 0x97, 0x66, 0xfa, 0x73, 0x5a, 0xfd, 0x38, 0xcd, 0x0d, 0xf5, 0xec, 0xa0, 0xf7, 0xd3, 0xea, 0xe7, - 0x8e, 0x50, 0x06, 0xf4, 0x97, 0xb4, 0x7a, 0x8c, 0x85, 0x32, 0xd0, 0xbd, 0x1f, 0xa0, 0xb7, 0xbf, - 0x10, 0xb8, 0x55, 0xfa, 0x2b, 0x6a, 0xdd, 0x2f, 0xc6, 0x24, 0x7d, 0x08, 0x15, 0xfc, 0xa9, 0xed, - 0x3e, 0x42, 0x14, 0x5d, 0xf8, 0x8f, 0x41, 0xc3, 0x82, 0xa5, 0x50, 0x7b, 0xc3, 0x27, 0x31, 0xe4, - 0x10, 0x20, 0x9f, 0xa6, 0x79, 0x71, 0x2b, 0x44, 0x71, 0x28, 0xcb, 0xcf, 0x66, 0xe0, 0xca, 0xfe, - 0x73, 0x25, 0xc4, 0x5f, 0x2f, 0x02, 0xfa, 0x42, 0x09, 0xa9, 0x39, 0x25, 0xfa, 0x52, 0x09, 0xa9, - 0x39, 0x25, 0x2d, 0xe4, 0x2b, 0x0c, 0x2c, 0xef, 0xb4, 0x5c, 0xd1, 0xaf, 0x21, 0x6b, 0x4d, 0x11, - 0x53, 0xf7, 0x1b, 0x54, 0x66, 0x4d, 0x31, 0xfa, 0x7f, 0x24, 0x8c, 0xfa, 0x9a, 0xa0, 0x44, 0xc7, - 0x74, 0x31, 0x39, 0xee, 0xf8, 0x74, 0x2c, 0xbe, 0x87, 0x91, 0xf1, 0x71, 0x5d, 0xf8, 0x8d, 0x4a, - 0xd4, 0x84, 0x23, 0xe9, 0xf8, 0x2e, 0xfc, 0x18, 0xaa, 0xde, 0x49, 0x74, 0x82, 0x6e, 0x4d, 0x88, - 0x20, 0x14, 0x74, 0x62, 0x17, 0x4f, 0x07, 0xdd, 0xd2, 0x4a, 0x4e, 0x52, 0x44, 0x6e, 0x79, 0x5c, - 0xd2, 0xc9, 0x5d, 0x78, 0x24, 0xf3, 0xb7, 0xee, 0x3d, 0xa5, 0x0b, 0xbf, 0x0c, 0x73, 0x0e, 0xa7, - 0x76, 0xe1, 0xb7, 0xb4, 0x46, 0x0e, 0xa7, 0xc1, 0x33, 0x5f, 0xe3, 0x38, 0xa7, 0x77, 0xa9, 0xbf, - 0xf9, 0x08, 0x8a, 0xd5, 0x1a, 0x9d, 0xd1, 0x85, 0xbb, 0x5b, 0x7d, 0x34, 0x44, 0x06, 0xaa, 0x62, - 0x67, 0x36, 0x83, 0xaa, 0x5c, 0x67, 0x75, 0xe9, 0xc5, 0xae, 0xc0, 0x78, 0x85, 0x37, 0x7c, 0x5b, - 0x97, 0xf2, 0xda, 0xd8, 0x4c, 0x95, 0xf3, 0x4a, 0x62, 0x92, 0x36, 0x75, 0xf1, 0xb4, 0x2e, 0xf8, - 0x7a, 0xbe, 0x9d, 0xad, 0x9a, 0x81, 0x5b, 0xc5, 0xae, 0x7b, 0x4e, 0x17, 0xce, 0x96, 0xc0, 0xad, - 0x2a, 0xf6, 0x73, 0xa3, 0xb6, 0xa2, 0x3c, 0x0f, 0xb9, 0x8c, 0x78, 0x87, 0x89, 0x49, 0xda, 0xac, - 0xbe, 0x6b, 0x35, 0x11, 0xd0, 0x96, 0xae, 0xee, 0xef, 0x6d, 0xdb, 0xb3, 0x2c, 0xf1, 0xc2, 0x9e, - 0x65, 0x89, 0x37, 0xf7, 0x2c, 0x4b, 0x6c, 0x7d, 0x6b, 0xd9, 0x5e, 0xd6, 0xd2, 0xa2, 0x5f, 0xed, - 0xac, 0xb9, 0x5e, 0xb9, 0xe8, 0xd4, 0x3a, 0xa5, 0x5b, 0x1a, 0xc5, 0x9f, 0x28, 0x0d, 0x25, 0xfe, - 0x3f, 0x00, 0x00, 0xff, 0xff, 0xc7, 0x07, 0xed, 0x1d, 0x70, 0x26, 0x00, 0x00, + // 4300 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x5a, 0x67, 0x74, 0x1c, 0x55, + 0x96, 0xa6, 0x6d, 0x19, 0xec, 0x72, 0xba, 0x14, 0x36, 0x6a, 0xd8, 0xb3, 0xb6, 0x8c, 0xe6, 0xac, + 0x18, 0x66, 0x57, 0x3d, 0x63, 0x4c, 0x6b, 0x7f, 0x6c, 0x6a, 0xa9, 0x65, 0xd1, 0xb3, 0x92, 0x2c, + 0xab, 0x5b, 0x66, 0xf6, 0xd7, 0x9c, 0x52, 0xf7, 0x53, 0xab, 0xa0, 0xbb, 0xaa, 0xa9, 0x7a, 0x2d, + 0x4b, 0x6c, 0x38, 0xe4, 0x1c, 0x6c, 0x82, 0x6d, 0x72, 0x86, 0x21, 0x87, 0x19, 0x72, 0x4e, 0x83, + 0x8d, 0x89, 0x03, 0x38, 0x00, 0xc3, 0x30, 0x66, 0x12, 0x61, 0x02, 0x43, 0x8e, 0xb3, 0xe7, 0x7e, + 0xef, 0xbd, 0xea, 0x6a, 0x89, 0x5f, 0xaa, 0xf7, 0xbd, 0x7b, 0xbf, 0xfb, 0xbd, 0xfb, 0xf2, 0x53, + 0x5b, 0x24, 0x26, 0x6b, 0x81, 0x08, 0x43, 0xd7, 0xf7, 0x3a, 0x6b, 0x81, 0x2f, 0x7d, 0xbb, 0x45, + 0xba, 0xb5, 0xd1, 0x03, 0x97, 0x94, 0xfd, 0xb2, 0x0f, 0x20, 0xc5, 0x5f, 0xaa, 0xee, 0xa0, 0xbb, + 0x12, 0xd6, 0xbc, 0xd5, 0xae, 0xa8, 0x94, 0x0a, 0x53, 0x35, 0x61, 0x2f, 0xb1, 0x66, 0xc9, 0x5a, + 0x32, 0xd1, 0x96, 0x38, 0x78, 0x4e, 0x77, 0xcb, 0xd6, 0x37, 0x97, 0xef, 0x35, 0x3c, 0x4b, 0xd6, + 0xec, 0xa4, 0xd5, 0x32, 0x56, 0x71, 0xca, 0xc9, 0x59, 0x6d, 0x89, 0x83, 0x17, 0x6a, 0x1c, 0x88, + 0xaa, 0x11, 0x5e, 0x72, 0x76, 0xcc, 0x03, 0x88, 0xbd, 0xcc, 0xda, 0xa7, 0x24, 0x8a, 0x6e, 0xd5, + 0xa9, 0x24, 0x5b, 0x62, 0x95, 0x06, 0xe4, 0xfa, 0xa2, 0x5f, 0xa9, 0x38, 0x52, 0x24, 0xe7, 0xc4, + 0xeb, 0x35, 0x88, 0xfa, 0x71, 0x27, 0x08, 0x85, 0x4c, 0xee, 0xdd, 0x96, 0x38, 0x78, 0x5e, 0x54, + 0xaf, 0xc0, 0x83, 0x9e, 0x48, 0x58, 0x2d, 0xbd, 0x93, 0xb5, 0xc0, 0xfe, 0x4e, 0x24, 0x79, 0xd1, + 0xca, 0x45, 0x9d, 0xdc, 0xd2, 0x4e, 0xc6, 0xb9, 0x39, 0xb1, 0x26, 0x90, 0x35, 0x7b, 0xc2, 0xa9, + 0xa0, 0x05, 0x0b, 0x86, 0xf9, 0xd3, 0xfe, 0x07, 0x6b, 0x6e, 0x71, 0xdc, 0xad, 0x94, 0x02, 0xc8, + 0x9f, 0x7d, 0xf0, 0xfc, 0x95, 0x56, 0xc3, 0x7b, 0x38, 0xaa, 0xb3, 0xbf, 0x67, 0xcd, 0x0e, 0xdd, + 0x32, 0x1a, 0xb1, 0x68, 0xe5, 0x7e, 0xca, 0x24, 0x5f, 0x74, 0x2a, 0x4e, 0xb0, 0xba, 0xee, 0x15, + 0xf3, 0x6e, 0x59, 0x47, 0x61, 0x2b, 0xbb, 0xd3, 0xb2, 0xc6, 0x38, 0x99, 0x3f, 0x96, 0x53, 0x35, + 0xd5, 0xb0, 0xf9, 0x2b, 0x17, 0x2b, 0x9f, 0x28, 0xc9, 0xc3, 0xf3, 0xc6, 0xcc, 0xe7, 0x41, 0xdd, + 0xd6, 0xde, 0xdd, 0x53, 0x39, 0x29, 0xaa, 0xf6, 0x32, 0xab, 0x85, 0xfb, 0x0d, 0x0d, 0x69, 0x96, + 0x02, 0x9c, 0x33, 0x5d, 0x12, 0x61, 0x11, 0x2d, 0x98, 0x6b, 0x32, 0xcd, 0xc8, 0x21, 0x9b, 0x5a, + 0xac, 0xb9, 0xa6, 0xc5, 0xf6, 0x5c, 0xab, 0x65, 0xb0, 0x5e, 0xa9, 0xd0, 0x5e, 0xf6, 0x3c, 0x6b, + 0x4e, 0xce, 0x93, 0xe9, 0x55, 0x94, 0xb0, 0x2d, 0x6b, 0xef, 0x11, 0x17, 0xdf, 0xb3, 0xec, 0xf9, + 0xd6, 0x3e, 0xab, 0x2b, 0xbe, 0x23, 0x0f, 0x5d, 0x49, 0xb3, 0xa3, 0x42, 0x7a, 0x15, 0xb5, 0xb0, + 0x55, 0x5e, 0x06, 0xae, 0x57, 0xa6, 0x39, 0xec, 0xdc, 0x3d, 0x25, 0x45, 0x48, 0x7b, 0xdb, 0x0b, + 0xac, 0xb9, 0x03, 0x53, 0xe1, 0xd1, 0x95, 0x6e, 0x57, 0x92, 0xb0, 0xc9, 0x5a, 0x80, 0x52, 0x56, + 0x75, 0x23, 0x8d, 0xd9, 0xfb, 0x5a, 0x0b, 0x15, 0x52, 0x0f, 0x1c, 0xe9, 0xfa, 0x1e, 0x95, 0xed, + 0x85, 0xd6, 0x3c, 0x40, 0xbd, 0x5e, 0xbd, 0x4a, 0xe3, 0x11, 0xc3, 0xe1, 0x62, 0x92, 0xdc, 0xa8, + 0x94, 0x17, 0x92, 0x8e, 0x8c, 0x4c, 0x0b, 0x6e, 0x55, 0xd0, 0x51, 0x51, 0xf1, 0x87, 0xa1, 0xef, + 0x51, 0xc5, 0x5e, 0x64, 0xcd, 0x5b, 0xe7, 0x54, 0xea, 0xa2, 0xdf, 0x0d, 0x25, 0x6d, 0x4e, 0x70, + 0xb9, 0xc7, 0xaf, 0xd4, 0xab, 0xde, 0xb0, 0x18, 0xa3, 0x6d, 0xdc, 0xb0, 0x39, 0x3d, 0x7e, 0xdd, + 0x93, 0x74, 0x5f, 0xab, 0x3d, 0xd7, 0x9a, 0x9d, 0xaf, 0x57, 0xe9, 0x7e, 0x7c, 0x65, 0x26, 0xca, + 0xf4, 0x00, 0xbe, 0x06, 0x5c, 0x8f, 0x1e, 0x54, 0x5f, 0xce, 0x24, 0x3d, 0xd4, 0xca, 0x3e, 0xab, + 0xdd, 0x20, 0x94, 0xf4, 0x70, 0xab, 0x4d, 0xd6, 0xfc, 0xbe, 0xc0, 0xaf, 0xd7, 0x7a, 0x7c, 0xaf, + 0xe8, 0x48, 0x7a, 0xa4, 0xd5, 0x5e, 0x6c, 0x59, 0x99, 0x72, 0xf9, 0xc7, 0xdd, 0xae, 0xcc, 0x78, + 0x25, 0x7a, 0xb4, 0x95, 0x43, 0x6a, 0x60, 0x4d, 0x40, 0x8f, 0xc5, 0x0d, 0x7e, 0xe4, 0x07, 0xf4, + 0xb8, 0x8a, 0x2b, 0x4b, 0xf4, 0x44, 0xab, 0x3d, 0x9f, 0x13, 0x58, 0x2a, 0x89, 0x09, 0x7a, 0x12, + 0x7e, 0xaa, 0x30, 0xe4, 0xd7, 0xe8, 0x29, 0xf8, 0xa9, 0x72, 0xde, 0xa9, 0xd6, 0xe8, 0xe7, 0xb0, + 0x5e, 0xe7, 0x04, 0x5c, 0xfb, 0x74, 0xab, 0xbd, 0xc0, 0xda, 0x67, 0x9d, 0x13, 0xa0, 0x6a, 0x6b, + 0xab, 0xbd, 0xd0, 0x9a, 0xbb, 0xce, 0x09, 0x5c, 0xc7, 0x2b, 0x0a, 0xda, 0xd6, 0x6a, 0xef, 0x6b, + 0x2d, 0xe0, 0x7c, 0x64, 0x82, 0xc0, 0x99, 0xca, 0x94, 0xcb, 0xf4, 0x4c, 0xab, 0x6d, 0x5b, 0x0b, + 0x19, 0x5a, 0x33, 0x7a, 0xa4, 0x28, 0x4a, 0xc6, 0xb6, 0xab, 0x08, 0xd1, 0xb8, 0xa4, 0x0d, 0x83, + 0x87, 0x7c, 0x9a, 0xb5, 0x16, 0x36, 0x8d, 0x54, 0xee, 0xbd, 0x1e, 0x27, 0x94, 0x39, 0x4f, 0x66, + 0xc2, 0x9c, 0x27, 0x69, 0x2f, 0xee, 0xbd, 0x08, 0x19, 0x16, 0x4e, 0x85, 0x12, 0xf6, 0x7e, 0xd6, + 0xe2, 0x08, 0xd2, 0x03, 0x62, 0x96, 0xbd, 0xc4, 0xa2, 0x08, 0x34, 0x7d, 0x3f, 0xbb, 0xc9, 0x1b, + 0x3d, 0xd8, 0x62, 0x2f, 0xb5, 0xf6, 0x6d, 0x18, 0x9a, 0x21, 0x31, 0xa7, 0xc9, 0x12, 0x9d, 0xbb, + 0xb7, 0x81, 0x38, 0xaa, 0x52, 0x63, 0xd9, 0xb6, 0xb5, 0xa8, 0x01, 0x41, 0xce, 0x7c, 0x13, 0x59, + 0x61, 0x5a, 0xcf, 0x02, 0x13, 0x46, 0xa1, 0x46, 0xd0, 0xc2, 0x66, 0x02, 0x28, 0x5a, 0x64, 0xef, + 0x6f, 0xd9, 0x31, 0x53, 0x23, 0x69, 0x71, 0xb3, 0x2d, 0x34, 0x91, 0x09, 0xa6, 0x09, 0x95, 0xac, + 0x25, 0x26, 0x58, 0x84, 0x42, 0xd9, 0x52, 0xbb, 0xd5, 0xda, 0xaf, 0x09, 0xd6, 0xe2, 0xf6, 0xb7, + 0x93, 0xd6, 0x92, 0xa6, 0x0a, 0xa3, 0xaf, 0x75, 0x06, 0x13, 0x24, 0x26, 0xed, 0x03, 0xac, 0xa5, + 0xcd, 0x0e, 0x46, 0xe5, 0x01, 0x33, 0x3c, 0x20, 0xf4, 0x40, 0xd3, 0x49, 0x2a, 0xa4, 0xd2, 0xb9, + 0xcc, 0xa8, 0x37, 0x20, 0x64, 0x2e, 0x37, 0xed, 0x37, 0xa8, 0x56, 0xd9, 0x66, 0xe4, 0x1b, 0xdc, + 0x88, 0x5c, 0x31, 0x9d, 0x06, 0x1a, 0x0f, 0x32, 0x8d, 0x8a, 0xcc, 0x8d, 0xc4, 0xf6, 0xe9, 0xf6, + 0x50, 0xf8, 0x1d, 0xd3, 0xbd, 0xec, 0xad, 0xf4, 0x1d, 0x6c, 0x32, 0xae, 0x20, 0xa8, 0xfb, 0xae, + 0x71, 0x56, 0x98, 0xd6, 0x76, 0x88, 0x69, 0xb5, 0x42, 0x8d, 0xb2, 0xef, 0x35, 0x13, 0x40, 0xd7, + 0x3f, 0x9a, 0xe6, 0x69, 0x53, 0xa3, 0xea, 0x9f, 0x9a, 0x6d, 0xa1, 0xa9, 0x33, 0x4a, 0xa6, 0xb6, + 0x52, 0xba, 0x56, 0x1a, 0x8a, 0x06, 0x0c, 0x6d, 0x87, 0x46, 0xfd, 0x18, 0xe1, 0x5a, 0xdf, 0xaa, + 0xa8, 0xc3, 0xa2, 0x1a, 0xa3, 0xf1, 0xb0, 0x99, 0x64, 0xd0, 0x99, 0xb6, 0x0f, 0xb4, 0xf6, 0x9f, + 0xe6, 0x62, 0xb4, 0x76, 0xcd, 0xf4, 0x81, 0xde, 0x7f, 0x36, 0x39, 0xc4, 0xec, 0x87, 0xd6, 0x7f, + 0x31, 0xcd, 0x52, 0x10, 0x74, 0xfe, 0xab, 0xc9, 0xa1, 0xc2, 0xb4, 0xc6, 0x7f, 0x33, 0x8d, 0x55, + 0xa8, 0xd1, 0xf7, 0xef, 0xcd, 0x04, 0xd0, 0xf6, 0x1f, 0x26, 0xbe, 0x36, 0x35, 0xba, 0x32, 0xcd, + 0xb6, 0xd0, 0xd4, 0xcd, 0x6b, 0x66, 0x8f, 0xef, 0x54, 0x44, 0x58, 0x14, 0xac, 0xe8, 0x9d, 0x36, + 0x5e, 0x9f, 0x0c, 0x02, 0x41, 0xef, 0xb6, 0xd9, 0x4b, 0xac, 0xc5, 0x06, 0x32, 0x91, 0xdf, 0x6b, + 0xb3, 0xf7, 0xb3, 0x16, 0x19, 0x54, 0xab, 0x7c, 0xbf, 0xc9, 0x1b, 0x6a, 0xfe, 0xd8, 0x66, 0x2f, + 0xb5, 0x28, 0xf2, 0x36, 0x62, 0xfe, 0xd4, 0x64, 0x09, 0x2d, 0x7f, 0x6e, 0xe3, 0x7d, 0xaa, 0xbf, + 0xc0, 0x32, 0x4a, 0xbc, 0x7d, 0xf5, 0x17, 0x10, 0x5f, 0xf0, 0x36, 0xd2, 0x5f, 0x68, 0x6c, 0x51, + 0x0b, 0xac, 0xb9, 0xfd, 0x05, 0x1d, 0xb1, 0xac, 0x0c, 0x11, 0x6a, 0xdc, 0x5e, 0x64, 0x59, 0xfd, + 0x85, 0x28, 0x86, 0xab, 0xea, 0x40, 0x7e, 0x24, 0xb8, 0x7b, 0x99, 0xdb, 0x03, 0xdc, 0x0b, 0x6e, + 0x1f, 0xdc, 0xbd, 0x86, 0xbb, 0x06, 0xee, 0x5e, 0xcd, 0x7d, 0xb4, 0x32, 0x04, 0x77, 0x00, 0xee, + 0xde, 0x88, 0x3b, 0x54, 0x75, 0xe0, 0x96, 0xcc, 0xdd, 0x07, 0xdd, 0x93, 0x0c, 0xf7, 0x29, 0xdd, + 0x53, 0xcc, 0xdd, 0x17, 0xe9, 0x3e, 0x86, 0xb9, 0xfb, 0x8c, 0xee, 0xff, 0x56, 0x86, 0xe0, 0xfe, + 0x1f, 0xe6, 0xee, 0x6b, 0xe8, 0xfe, 0x5f, 0x55, 0x07, 0xee, 0xff, 0x53, 0x9b, 0x9a, 0x70, 0xa4, + 0xc0, 0x72, 0x4b, 0x9f, 0x22, 0x71, 0x06, 0x41, 0xa0, 0xcf, 0xd0, 0x41, 0x06, 0x32, 0xf1, 0x3e, + 0x47, 0x07, 0x19, 0x54, 0x87, 0xfd, 0xa2, 0xc9, 0x1b, 0xd1, 0xbf, 0x6c, 0xe3, 0x0d, 0xaa, 0x5f, + 0xa8, 0xe5, 0x9c, 0xbe, 0x6a, 0xe3, 0xbd, 0x0e, 0x45, 0x90, 0x7f, 0x0d, 0x0f, 0x94, 0x0d, 0xf3, + 0x37, 0x6d, 0x2c, 0x0a, 0x90, 0xa6, 0xfd, 0x5b, 0xc3, 0x09, 0x9c, 0xc7, 0xae, 0x60, 0x8b, 0x9c, + 0x27, 0x45, 0x30, 0xe1, 0x54, 0x98, 0xf6, 0xb8, 0x15, 0x4c, 0x63, 0x10, 0x30, 0x1f, 0xbf, 0x82, + 0x37, 0xef, 0x3e, 0xf4, 0xc9, 0xf1, 0x09, 0xde, 0x40, 0xfb, 0x54, 0xa7, 0x9c, 0x80, 0x93, 0x41, + 0x5f, 0xd4, 0x2b, 0x27, 0x26, 0x58, 0x61, 0x9f, 0xe9, 0x96, 0x93, 0xb4, 0x2d, 0x22, 0x9d, 0x9c, + 0xe0, 0x8d, 0xb2, 0xaf, 0xd1, 0x31, 0xa7, 0xe8, 0x5a, 0x64, 0xef, 0x54, 0x9c, 0x29, 0x7a, 0xd7, + 0x72, 0x88, 0x33, 0x51, 0xd1, 0xbb, 0x16, 0x21, 0xce, 0x42, 0x88, 0xde, 0xb5, 0x26, 0xc4, 0xd9, + 0x08, 0xd1, 0xbb, 0x56, 0x87, 0x38, 0x47, 0xdb, 0x22, 0xc4, 0x06, 0x84, 0xe8, 0x5d, 0x1b, 0x85, + 0xd8, 0xa8, 0x6b, 0x11, 0xe2, 0x5c, 0x84, 0x18, 0x44, 0x2b, 0x36, 0xa1, 0x62, 0x50, 0xb5, 0x42, + 0x9d, 0x6f, 0x06, 0xa3, 0x56, 0x6c, 0x41, 0x88, 0x41, 0xd3, 0x8a, 0x0b, 0xb5, 0x2d, 0x42, 0x5c, + 0x84, 0x10, 0x83, 0x8d, 0x56, 0x5c, 0xac, 0x6b, 0x11, 0xe2, 0x12, 0xc5, 0x54, 0xaf, 0x54, 0x54, + 0x4b, 0xae, 0x50, 0xd6, 0x28, 0x23, 0xd4, 0x95, 0x09, 0x3e, 0x41, 0x28, 0xc0, 0x84, 0xbb, 0x2a, + 0xc1, 0x09, 0x57, 0x98, 0x0e, 0x79, 0x75, 0xcc, 0x0f, 0x61, 0xaf, 0xe1, 0xd3, 0xc1, 0x22, 0xed, + 0x67, 0x42, 0x5f, 0x1b, 0xb3, 0x42, 0xf8, 0xeb, 0x20, 0x7c, 0xa8, 0x52, 0x57, 0xeb, 0xd3, 0xd6, + 0x04, 0xf7, 0x2d, 0x17, 0x4d, 0xa8, 0x6d, 0x09, 0x3e, 0xf0, 0x30, 0xc2, 0xea, 0xb6, 0x43, 0xed, + 0x80, 0xeb, 0x69, 0xfb, 0x67, 0x21, 0x04, 0x65, 0xe3, 0xf0, 0x1c, 0x18, 0x01, 0xb1, 0xc7, 0x0b, + 0xca, 0xa2, 0x5e, 0x91, 0x6e, 0xad, 0x32, 0x05, 0xa7, 0x17, 0x13, 0x3c, 0xa4, 0x0d, 0x64, 0xfc, + 0x5e, 0x42, 0x68, 0x83, 0xb2, 0xeb, 0x2f, 0x20, 0x36, 0xeb, 0x4e, 0xb8, 0x25, 0xb5, 0x58, 0xbd, + 0x8c, 0x54, 0x28, 0xc0, 0xb8, 0xbd, 0x92, 0xd0, 0x63, 0x4f, 0xc1, 0xec, 0xf7, 0x6a, 0x82, 0x57, + 0xa5, 0x08, 0x32, 0x96, 0x3b, 0xd0, 0x92, 0x01, 0xbf, 0x04, 0xae, 0x9d, 0x20, 0x1f, 0xf0, 0x4b, + 0xa6, 0x7a, 0x17, 0x7a, 0x65, 0xc0, 0x2f, 0x31, 0xc5, 0xee, 0x84, 0x9d, 0xb4, 0xf6, 0x8b, 0x89, + 0x19, 0xf1, 0x42, 0xb7, 0xec, 0x89, 0x12, 0xbd, 0x06, 0xb3, 0xcc, 0x28, 0x1a, 0x77, 0x17, 0x31, + 0x65, 0x66, 0x34, 0x1c, 0xe1, 0xd2, 0xdd, 0xa6, 0x84, 0x00, 0xf7, 0x10, 0xce, 0x9f, 0xa3, 0x51, + 0x62, 0xee, 0x25, 0xac, 0x8a, 0xc2, 0xe5, 0x39, 0x53, 0xf0, 0xb3, 0xa2, 0x48, 0xf7, 0x35, 0x43, + 0x4c, 0x72, 0x7f, 0x04, 0x65, 0x45, 0x51, 0x41, 0x0f, 0x34, 0x43, 0xec, 0xf8, 0x20, 0x71, 0x92, + 0x19, 0x42, 0xac, 0x87, 0x88, 0x13, 0xb3, 0xba, 0xe2, 0xfb, 0x41, 0xc4, 0xfd, 0xf0, 0x34, 0x8c, + 0x99, 0x1e, 0x69, 0x60, 0x11, 0xfb, 0xa3, 0xd3, 0x30, 0xf6, 0x7d, 0x8c, 0xb8, 0x9b, 0x81, 0x81, + 0xff, 0x71, 0x94, 0x87, 0xfd, 0xba, 0xa7, 0x92, 0xb7, 0x0d, 0xe1, 0x51, 0x66, 0x8a, 0x67, 0x1a, + 0x45, 0xf6, 0xde, 0x4e, 0xf6, 0xfe, 0xd6, 0xbe, 0x28, 0x1e, 0xe1, 0xca, 0xf1, 0xd5, 0x81, 0x53, + 0x54, 0x83, 0x85, 0xb8, 0x5f, 0x9a, 0x70, 0xf6, 0x7e, 0x6e, 0x26, 0xcc, 0x2c, 0xcf, 0x23, 0x9b, + 0xfd, 0x7e, 0xf9, 0x07, 0x99, 0xa0, 0x4c, 0x2f, 0x23, 0x44, 0xbf, 0x5f, 0x5e, 0x99, 0x09, 0xca, + 0x21, 0xbd, 0x42, 0xf6, 0x3c, 0xab, 0x85, 0x8b, 0xf4, 0x2a, 0xf1, 0x1c, 0x65, 0xbb, 0xef, 0xd3, + 0x0e, 0xc0, 0xc3, 0x8e, 0x57, 0xa2, 0x9d, 0x48, 0x1a, 0x7f, 0x32, 0x69, 0x5e, 0x88, 0x12, 0xed, + 0x22, 0xbe, 0x00, 0x0c, 0xf9, 0xeb, 0x69, 0x37, 0xec, 0x7a, 0x7c, 0x6f, 0x82, 0x5e, 0x83, 0x7b, + 0xcf, 0x70, 0xcf, 0xa1, 0x2b, 0xe9, 0x75, 0xc0, 0x79, 0xb7, 0xec, 0xd1, 0x1b, 0xea, 0xf3, 0xe8, + 0x40, 0xd2, 0x2f, 0xf1, 0x99, 0x29, 0xfa, 0x21, 0xbd, 0xa9, 0x3e, 0x43, 0xd7, 0xa3, 0x5f, 0x41, + 0x50, 0x46, 0x3a, 0x1e, 0xf4, 0xbd, 0x85, 0x0c, 0x71, 0x51, 0x09, 0xfc, 0x35, 0x62, 0xf5, 0xf8, + 0x21, 0xed, 0xd1, 0x5f, 0x92, 0xde, 0x46, 0x8b, 0xb2, 0xa2, 0x1c, 0x08, 0x11, 0xd2, 0x6f, 0x80, + 0xf7, 0x4e, 0xd6, 0xe8, 0xb7, 0x64, 0xef, 0x63, 0xcd, 0x1a, 0xca, 0xd1, 0xef, 0x60, 0x30, 0xec, + 0x94, 0x5c, 0xc7, 0x0b, 0xe9, 0xf7, 0x30, 0xc8, 0xbb, 0x1e, 0xfd, 0x01, 0x5f, 0x05, 0xc7, 0xa3, + 0x77, 0x88, 0x27, 0x49, 0x21, 0xa8, 0xf3, 0x1d, 0x08, 0x83, 0xfd, 0x5d, 0xb4, 0xd3, 0x20, 0xc8, + 0xf3, 0x7b, 0x7c, 0x36, 0x5e, 0x6c, 0x20, 0x33, 0xfc, 0xde, 0xc7, 0x78, 0xec, 0xf7, 0xcb, 0x6e, + 0xd1, 0xa9, 0xf0, 0x85, 0xe9, 0xd2, 0x24, 0xd6, 0x75, 0x05, 0xac, 0x09, 0xe8, 0xb2, 0x64, 0xcc, + 0x80, 0x2f, 0x4c, 0x97, 0x27, 0xb9, 0x89, 0x23, 0x9e, 0x13, 0x4c, 0x0d, 0xfa, 0x92, 0xae, 0x48, + 0xf2, 0x40, 0x41, 0x31, 0x9a, 0xdd, 0xd7, 0x24, 0x79, 0x91, 0x69, 0x60, 0x88, 0x7f, 0x6d, 0x92, + 0xfb, 0xbf, 0x01, 0x1a, 0x05, 0xd7, 0x81, 0x40, 0x97, 0x72, 0x21, 0xee, 0xbe, 0xd7, 0x83, 0xc0, + 0xac, 0x4f, 0x1a, 0xfc, 0x09, 0x94, 0x30, 0x97, 0x06, 0x6e, 0x48, 0x72, 0x23, 0xd5, 0x4a, 0xa7, + 0xa1, 0x1b, 0x61, 0xc3, 0x2b, 0x9d, 0x06, 0x6e, 0x42, 0x73, 0x72, 0x9e, 0xd4, 0xe5, 0x9b, 0x61, + 0xc0, 0x8b, 0x9c, 0x06, 0x6e, 0x81, 0x81, 0xba, 0x2d, 0xe6, 0xdd, 0x32, 0xdd, 0x8a, 0xe6, 0xe1, + 0xb2, 0xc8, 0xc5, 0xdb, 0x4c, 0xf5, 0x8f, 0x7c, 0x94, 0x6f, 0x37, 0xe5, 0x41, 0x51, 0xe6, 0xf2, + 0x1d, 0x0d, 0xfe, 0x42, 0x50, 0x17, 0x74, 0x67, 0x4c, 0x24, 0x80, 0x9f, 0x36, 0x37, 0x0f, 0xd8, + 0xcf, 0x60, 0x04, 0xa7, 0xd5, 0x4e, 0x25, 0x14, 0x74, 0x57, 0x92, 0x3b, 0x50, 0x79, 0x29, 0xe4, + 0x6e, 0x95, 0x01, 0xe3, 0xa6, 0xc0, 0x7b, 0x54, 0xdf, 0x88, 0x31, 0x99, 0x1f, 0x77, 0xc7, 0x24, + 0xdd, 0xa7, 0x82, 0xb9, 0xe5, 0x71, 0x0d, 0xdc, 0x6f, 0xc4, 0xab, 0x3b, 0xf5, 0xbd, 0x20, 0xe9, + 0x13, 0x72, 0xc8, 0x09, 0x9c, 0xaa, 0xde, 0x12, 0x1e, 0x48, 0x62, 0xb7, 0x14, 0x72, 0x9d, 0x13, + 0xd0, 0x83, 0x28, 0x0c, 0xfb, 0xeb, 0xb9, 0x2d, 0x0f, 0xa1, 0x90, 0x57, 0x35, 0x0f, 0x43, 0x37, + 0xee, 0xee, 0x51, 0x57, 0x3d, 0x02, 0x3e, 0x8d, 0x99, 0xcd, 0xe3, 0xd1, 0x64, 0x74, 0xc9, 0x47, + 0xe7, 0x3f, 0x06, 0x51, 0xaa, 0xfc, 0xc3, 0xfc, 0x9a, 0x41, 0x7a, 0x3c, 0x06, 0x60, 0x24, 0x3c, + 0x81, 0x7e, 0x53, 0x80, 0x16, 0xf5, 0x64, 0xcc, 0x06, 0xfb, 0xd4, 0x53, 0x49, 0x9e, 0x80, 0x39, + 0x8f, 0x19, 0xaf, 0x5c, 0xce, 0xba, 0x72, 0x1e, 0x9c, 0xaf, 0x5a, 0xae, 0x12, 0x6e, 0x34, 0x5d, + 0xbd, 0x9c, 0x9b, 0x9c, 0xf3, 0x34, 0xd1, 0x35, 0xda, 0x16, 0x24, 0xd7, 0x2e, 0x57, 0x79, 0x8e, + 0xb4, 0x5e, 0xa7, 0x6b, 0xb1, 0xc9, 0x5d, 0xaf, 0x98, 0xc6, 0x78, 0x18, 0x70, 0x98, 0x93, 0xda, + 0x60, 0x8d, 0x32, 0x42, 0x9d, 0xdc, 0xc6, 0x29, 0x50, 0x80, 0x09, 0x77, 0x0a, 0xce, 0x46, 0x0a, + 0xd3, 0x21, 0x4f, 0x8d, 0xf9, 0x21, 0xec, 0x69, 0x38, 0x86, 0x69, 0x3f, 0x13, 0xfa, 0xf4, 0x36, + 0x34, 0x68, 0x8c, 0x23, 0x9d, 0xd1, 0x06, 0x19, 0x63, 0x88, 0x72, 0x66, 0x9b, 0x92, 0x61, 0x22, + 0x9c, 0x85, 0xc3, 0x59, 0x6e, 0x4c, 0xb3, 0x9f, 0xad, 0x6d, 0xc1, 0x7c, 0x8e, 0x0e, 0x15, 0xb1, + 0x6e, 0x88, 0xc5, 0x46, 0xa3, 0x36, 0x6a, 0x73, 0x75, 0x50, 0xc1, 0xa9, 0xad, 0xc7, 0x09, 0xc5, + 0x11, 0xe3, 0x02, 0xa9, 0xfc, 0x8b, 0x3a, 0x83, 0x6b, 0x04, 0xf1, 0x3f, 0x50, 0x67, 0x7d, 0x0d, + 0x19, 0x15, 0x7f, 0x55, 0x67, 0x7d, 0x8d, 0x6a, 0x2d, 0x1f, 0x36, 0x79, 0x43, 0xd1, 0x47, 0xea, + 0xac, 0x6f, 0xbc, 0x8d, 0xae, 0x8f, 0x9b, 0x2c, 0x21, 0xe6, 0x13, 0x48, 0xcd, 0x60, 0x34, 0x05, + 0x53, 0x35, 0x49, 0x17, 0xb4, 0x6b, 0xa0, 0xd7, 0x53, 0xc0, 0xa6, 0x76, 0x6c, 0x5f, 0x7e, 0x15, + 0x8f, 0x9f, 0xb4, 0xb9, 0x1d, 0x6f, 0x3e, 0xd9, 0xc3, 0x68, 0x0b, 0x2a, 0x86, 0x9c, 0x30, 0x5c, + 0xef, 0x07, 0x25, 0xba, 0xb0, 0x1d, 0xb3, 0xc5, 0xf1, 0x4a, 0x7e, 0x55, 0xbd, 0x71, 0x5d, 0xd4, + 0x8e, 0x75, 0xf9, 0xf0, 0xcc, 0x0f, 0xe8, 0x62, 0xf3, 0xb9, 0x92, 0x2e, 0x41, 0x80, 0x11, 0xaf, + 0x68, 0x18, 0x2f, 0x6d, 0xb7, 0x5b, 0x2d, 0xbb, 0x01, 0x88, 0x52, 0xbf, 0xf0, 0xca, 0x72, 0x9c, + 0x2e, 0x43, 0x80, 0xac, 0x23, 0x9d, 0x51, 0x27, 0x14, 0x74, 0x43, 0x3b, 0x36, 0x3a, 0x6c, 0x6c, + 0xfe, 0xfa, 0x90, 0x6e, 0x44, 0xc0, 0x9e, 0x7a, 0x10, 0x08, 0x4f, 0x8e, 0x84, 0x22, 0xa0, 0x9b, + 0x10, 0x05, 0x9f, 0x37, 0xb7, 0xab, 0x6b, 0x8d, 0xe7, 0x89, 0x22, 0x56, 0xab, 0x2c, 0xdd, 0x02, + 0xa8, 0x1f, 0xc7, 0xeb, 0x50, 0x04, 0x32, 0x97, 0xa5, 0x5b, 0x11, 0x3a, 0x0e, 0xf1, 0x06, 0x94, + 0xcb, 0xd2, 0x6d, 0xed, 0x78, 0x3a, 0x12, 0x41, 0xc8, 0x79, 0xbb, 0x1d, 0x91, 0x0a, 0x6e, 0xb6, + 0xdb, 0x20, 0x77, 0xb4, 0xab, 0x5d, 0x74, 0xbd, 0x9a, 0xd2, 0x77, 0xb6, 0xf3, 0x30, 0xca, 0x57, + 0x84, 0xa8, 0xd1, 0xd3, 0xed, 0x6a, 0xbb, 0x2b, 0x1e, 0x45, 0x5b, 0x55, 0x4a, 0x44, 0x45, 0x38, + 0xa1, 0x00, 0xb2, 0x8d, 0x6f, 0xf5, 0x8b, 0xcd, 0xa3, 0x83, 0x37, 0x85, 0xb9, 0x45, 0xcf, 0xb4, + 0x73, 0x77, 0x45, 0xb7, 0x54, 0x03, 0x6f, 0x6f, 0xd7, 0x87, 0xf7, 0x08, 0x79, 0x16, 0x4d, 0xe0, + 0xf9, 0x1b, 0x41, 0xcf, 0x01, 0xc2, 0x63, 0x8b, 0x81, 0x9e, 0x6f, 0xe7, 0x51, 0xa2, 0x9f, 0x0d, + 0x0c, 0xf8, 0x02, 0xec, 0x70, 0x6b, 0x37, 0xd0, 0x8b, 0xed, 0x6a, 0x92, 0x0a, 0x99, 0x91, 0xbe, + 0x47, 0x2f, 0x45, 0xc5, 0x41, 0xe9, 0x3b, 0xf4, 0x8b, 0x76, 0x35, 0xa5, 0x85, 0x4c, 0xa3, 0xfa, + 0xe5, 0x46, 0x19, 0xf5, 0xaf, 0xb4, 0x63, 0x4c, 0x87, 0xb9, 0xa1, 0x89, 0x55, 0xf4, 0x2a, 0xd8, + 0x55, 0x81, 0x87, 0x8a, 0x23, 0x69, 0x47, 0x0c, 0x1a, 0x70, 0x6a, 0x35, 0x51, 0xa2, 0x9d, 0x0d, + 0x97, 0x34, 0xed, 0x52, 0x9d, 0x35, 0x92, 0xcb, 0xd2, 0x6e, 0x64, 0xbb, 0xdf, 0x3d, 0x4a, 0xf0, + 0x82, 0xb7, 0x63, 0x05, 0xe7, 0x68, 0x58, 0x94, 0xc5, 0x64, 0xad, 0xdb, 0xe5, 0x9d, 0x89, 0xd1, + 0x9d, 0x2b, 0x70, 0xac, 0x01, 0xca, 0xe5, 0x5d, 0x2b, 0xb8, 0x91, 0x3c, 0x86, 0x7b, 0x27, 0x65, + 0xe0, 0x14, 0x25, 0x83, 0xa7, 0x75, 0x18, 0x70, 0xc4, 0x3b, 0xba, 0xee, 0x4b, 0xf0, 0x9d, 0xde, + 0xc1, 0x69, 0x64, 0xb0, 0x30, 0x55, 0x03, 0x72, 0x46, 0x87, 0xd9, 0x6e, 0xf2, 0x02, 0x7e, 0x67, + 0x76, 0x98, 0x97, 0x3f, 0x35, 0x0e, 0x18, 0x3b, 0x2b, 0xe2, 0x1a, 0x16, 0xb5, 0x8a, 0x53, 0x84, + 0xe7, 0xd9, 0x91, 0xe1, 0xb0, 0xa8, 0xfa, 0x13, 0xc0, 0xce, 0xe9, 0x30, 0x2f, 0x89, 0x03, 0x22, + 0x28, 0x03, 0xda, 0xd0, 0xd1, 0xfc, 0x92, 0xc8, 0xd8, 0xc6, 0x8e, 0xa6, 0x07, 0x47, 0x86, 0xce, + 0x8d, 0xa0, 0x75, 0x4e, 0xc5, 0xc5, 0x46, 0x77, 0x5e, 0x07, 0x37, 0x9e, 0xa1, 0x1e, 0xdf, 0x93, + 0x8e, 0xeb, 0x85, 0x8c, 0x9e, 0xdf, 0xc1, 0xe3, 0xb4, 0xf1, 0x58, 0x59, 0xab, 0x09, 0xb5, 0x2f, + 0x5e, 0xd0, 0x5c, 0xd1, 0x50, 0xbf, 0xa9, 0x83, 0xf7, 0xf5, 0x48, 0xd4, 0x90, 0x23, 0x8b, 0xe3, + 0x8c, 0x6f, 0xee, 0xb0, 0x0f, 0xb0, 0x96, 0x34, 0xf0, 0x40, 0x84, 0x22, 0x50, 0xed, 0xd8, 0xd2, + 0xc1, 0xe7, 0xe8, 0x78, 0xe8, 0x21, 0x47, 0xc2, 0xe9, 0xc2, 0xa8, 0x39, 0x43, 0x81, 0x90, 0x12, + 0xda, 0x2f, 0x8a, 0xb4, 0xaf, 0x35, 0x89, 0xbe, 0x38, 0x32, 0xcb, 0x0b, 0x27, 0x50, 0xf1, 0x2e, + 0x89, 0x04, 0xe6, 0xa5, 0x1f, 0x38, 0x9c, 0x9e, 0x63, 0x60, 0x7c, 0x69, 0xe4, 0x9f, 0x15, 0x35, + 0x15, 0xe6, 0xb2, 0xa8, 0xa3, 0xfe, 0x53, 0x4c, 0xa1, 0xdd, 0x97, 0x47, 0x8c, 0x6a, 0x49, 0x60, + 0xec, 0x8a, 0x0e, 0x9e, 0x2c, 0xc6, 0x0a, 0x27, 0x38, 0x86, 0xaf, 0x84, 0x69, 0xd6, 0x91, 0x62, + 0xb5, 0x1f, 0x54, 0x1d, 0x24, 0xe1, 0x83, 0x4e, 0x26, 0x64, 0xac, 0xdf, 0x95, 0x22, 0xe0, 0x05, + 0xb4, 0x53, 0x2f, 0x29, 0x22, 0xeb, 0x8e, 0x8d, 0xd1, 0x87, 0x9d, 0xe6, 0x6e, 0xc6, 0x13, 0x03, + 0xd0, 0x47, 0x9d, 0x2c, 0x98, 0x8b, 0x6a, 0x02, 0x45, 0x15, 0x1f, 0x77, 0xda, 0x7f, 0x67, 0xed, + 0x6f, 0x26, 0xe9, 0xb4, 0xca, 0x4f, 0x3a, 0xed, 0xbf, 0xb7, 0x92, 0xa6, 0xd2, 0xfc, 0x8d, 0xaa, + 0x3f, 0x05, 0x69, 0xc3, 0x27, 0xaa, 0xf8, 0x0c, 0xa4, 0xaa, 0x62, 0x86, 0xd7, 0xe7, 0x9d, 0xdc, + 0x57, 0xaa, 0x72, 0x5a, 0xbc, 0x2f, 0x3a, 0x39, 0x09, 0x86, 0x2a, 0x82, 0xbf, 0xec, 0xe4, 0x39, + 0xc5, 0xcd, 0xa3, 0xaf, 0xf0, 0x79, 0xb8, 0x5f, 0x0f, 0xe8, 0xeb, 0x4e, 0xdc, 0x96, 0x5c, 0xaf, + 0x2e, 0x05, 0x7d, 0xd3, 0xa9, 0x8e, 0x13, 0x45, 0xdf, 0x2b, 0xd1, 0xdf, 0x90, 0xa0, 0x01, 0xb7, + 0x18, 0xf8, 0x1a, 0x39, 0x36, 0xc5, 0x2b, 0xd9, 0x80, 0xef, 0xc9, 0x71, 0x3a, 0x2e, 0x85, 0x0b, + 0x24, 0x7f, 0x0f, 0x3a, 0x55, 0x41, 0xc7, 0xa7, 0x70, 0x21, 0xf5, 0xd7, 0xf3, 0x22, 0xc9, 0x07, + 0xe9, 0x13, 0x52, 0xb8, 0xee, 0x2a, 0xc0, 0xaf, 0x4b, 0xc6, 0x4e, 0x4c, 0xe1, 0xe0, 0xec, 0x4c, + 0xc1, 0xe5, 0x24, 0xb8, 0x64, 0x9d, 0xa9, 0x35, 0x63, 0x8a, 0xf3, 0x64, 0x70, 0x02, 0x38, 0x42, + 0x88, 0xa3, 0xe8, 0x94, 0x46, 0xf9, 0xbf, 0x84, 0x13, 0xd0, 0xa9, 0x29, 0xee, 0x11, 0xae, 0x62, + 0xce, 0x01, 0xbf, 0x24, 0xe8, 0xb4, 0x14, 0x4f, 0x09, 0x03, 0xf9, 0x75, 0x09, 0xf4, 0x74, 0xc4, + 0x61, 0x34, 0xeb, 0x4c, 0xd1, 0x19, 0x88, 0xc3, 0x25, 0xcd, 0x73, 0x66, 0x8a, 0x9b, 0x8f, 0xcf, + 0xb3, 0x52, 0x9c, 0x2b, 0xfe, 0x6c, 0xa2, 0x3d, 0x3b, 0xc5, 0xc3, 0x3d, 0x0e, 0x1b, 0xea, 0x73, + 0xa0, 0xa9, 0x4f, 0x48, 0x35, 0x92, 0x68, 0x43, 0x0a, 0xeb, 0xe9, 0x54, 0xc8, 0x89, 0xc5, 0xb5, + 0x27, 0xac, 0xd1, 0xc6, 0x14, 0x4f, 0xb0, 0x18, 0xe8, 0xd7, 0x25, 0xe3, 0xe7, 0xa6, 0x62, 0xbb, + 0x12, 0x7a, 0xe2, 0x3c, 0xe8, 0xd7, 0x08, 0x77, 0xd5, 0xf7, 0x39, 0x4f, 0xe7, 0x4f, 0x47, 0x71, + 0x35, 0xb9, 0x00, 0xb2, 0xb1, 0x87, 0x6f, 0x4a, 0xa9, 0x4d, 0xa7, 0x1a, 0x0d, 0xde, 0xcd, 0x68, + 0xf2, 0x48, 0xa1, 0x07, 0xb4, 0x5b, 0xa0, 0x7f, 0xa4, 0xd0, 0xc3, 0x26, 0xa1, 0x74, 0xaa, 0x35, + 0xd3, 0x2d, 0x17, 0xa6, 0x78, 0x50, 0x4d, 0xaf, 0xd1, 0xfd, 0x73, 0x11, 0x2a, 0x33, 0xa5, 0x12, + 0x93, 0x48, 0x6c, 0x07, 0xa5, 0xc6, 0x6b, 0x47, 0x8a, 0x47, 0x5c, 0x73, 0xa5, 0x3e, 0x65, 0x5c, + 0x82, 0x70, 0x99, 0x52, 0x09, 0x83, 0xcd, 0x91, 0x18, 0x74, 0x38, 0xab, 0x5f, 0x6a, 0x9c, 0xcc, + 0x8e, 0xd3, 0xe0, 0xbb, 0x2c, 0xc5, 0xe3, 0x3e, 0x5e, 0xa5, 0xd9, 0x2e, 0x47, 0xf6, 0x34, 0x9b, + 0xc2, 0xc0, 0x75, 0x45, 0xa4, 0x2e, 0xda, 0x0c, 0x1b, 0x6c, 0x57, 0x46, 0xea, 0x1a, 0x95, 0x9a, + 0xef, 0xaa, 0x26, 0x75, 0xba, 0x1a, 0x8c, 0x57, 0x1b, 0x09, 0xac, 0x39, 0xce, 0x76, 0x0d, 0x86, + 0x45, 0xa3, 0x42, 0x33, 0x5d, 0x0b, 0x05, 0xf9, 0xfa, 0xe8, 0xb7, 0xe5, 0xe7, 0x3a, 0x28, 0x68, + 0xae, 0xd4, 0x7e, 0xd7, 0x43, 0x41, 0xbe, 0x3e, 0x3a, 0x23, 0x3f, 0x3f, 0x31, 0x4e, 0x33, 0xf3, + 0x73, 0x03, 0xc4, 0xc5, 0xab, 0x34, 0xdb, 0x8d, 0x6a, 0x74, 0x29, 0xb6, 0x58, 0x7e, 0x6e, 0x8a, + 0xd4, 0x7d, 0x4b, 0x7e, 0x6e, 0x8e, 0xd4, 0xcd, 0xc8, 0xcf, 0x2d, 0x4d, 0xea, 0xe2, 0xf9, 0xb9, + 0xd5, 0x48, 0x98, 0x9e, 0x9f, 0xdb, 0x90, 0x9f, 0x46, 0x85, 0x66, 0xba, 0x1d, 0x41, 0x46, 0x3c, + 0x77, 0x32, 0x1a, 0x5d, 0x7a, 0x10, 0xd3, 0x1d, 0xf0, 0x68, 0xaa, 0xe2, 0xd3, 0xed, 0x9d, 0x33, + 0xe1, 0xac, 0x28, 0xd2, 0x4f, 0x53, 0xea, 0xdf, 0x8e, 0xde, 0x84, 0x08, 0x64, 0xe1, 0x18, 0xfa, + 0x59, 0x0a, 0x6f, 0x51, 0xce, 0x51, 0xc8, 0x1e, 0xdd, 0x15, 0x15, 0x31, 0x1b, 0xee, 0x86, 0xf5, + 0x90, 0x08, 0x5c, 0xbf, 0x94, 0x29, 0x95, 0xe8, 0x1e, 0x4c, 0x78, 0x55, 0xc6, 0xd2, 0x77, 0x2f, + 0x26, 0xc7, 0xda, 0xba, 0x13, 0x48, 0x11, 0xd0, 0x7d, 0x30, 0xcf, 0x8b, 0x62, 0xc1, 0x87, 0xfb, + 0xfd, 0x28, 0x63, 0xad, 0xe4, 0x95, 0x8e, 0x1e, 0x48, 0x99, 0xd3, 0x10, 0xf4, 0x30, 0xe3, 0x83, + 0x29, 0x5e, 0x18, 0x0b, 0x7e, 0xd6, 0x99, 0x0a, 0xe9, 0x21, 0x65, 0xaf, 0x57, 0xc5, 0x90, 0x1e, + 0xc6, 0x12, 0xa0, 0xa7, 0x94, 0x99, 0x67, 0x8f, 0xa0, 0x93, 0x62, 0xa0, 0x9e, 0x62, 0x8f, 0x62, + 0x59, 0x8c, 0xc8, 0x31, 0xb1, 0x1f, 0x03, 0x41, 0x84, 0xa9, 0x87, 0x87, 0xc7, 0x53, 0x66, 0x15, + 0x07, 0x68, 0xe6, 0xf9, 0x13, 0x68, 0x0a, 0x9f, 0x4a, 0x79, 0x69, 0x7b, 0x12, 0x6c, 0x79, 0x19, + 0xb0, 0x34, 0xa9, 0x92, 0xf3, 0x94, 0x1a, 0x1e, 0x71, 0x8c, 0x47, 0x23, 0xfd, 0x7c, 0x1a, 0x6e, + 0xfa, 0xf2, 0x69, 0x04, 0x5a, 0x1d, 0xf8, 0x55, 0xd3, 0x0d, 0x10, 0xb5, 0x75, 0x06, 0xcc, 0xba, + 0x68, 0x1b, 0x96, 0x26, 0x7d, 0xac, 0x8a, 0xb8, 0x9f, 0x69, 0x42, 0x0d, 0xf3, 0x76, 0x33, 0xf1, + 0xd8, 0x2e, 0xbe, 0x55, 0xd1, 0xb3, 0xf1, 0xf9, 0xa5, 0x9f, 0x03, 0x3c, 0x49, 0xcf, 0xc5, 0x97, + 0x18, 0xbd, 0xf1, 0xe9, 0xdb, 0xcd, 0xf3, 0x71, 0x8f, 0x9c, 0x67, 0xde, 0xb4, 0x5f, 0x40, 0x02, + 0x1a, 0x30, 0xb3, 0xbc, 0x98, 0xb2, 0x0f, 0xb4, 0x96, 0x6a, 0xcc, 0x48, 0xd4, 0xf6, 0x2f, 0xc5, + 0x67, 0xbc, 0xa9, 0xc3, 0x1b, 0xa5, 0x99, 0x04, 0x33, 0xb4, 0xbe, 0x1c, 0x1f, 0xeb, 0x0d, 0xad, + 0xaf, 0xc4, 0xa7, 0x7b, 0xb3, 0xd6, 0x57, 0xe3, 0x1e, 0x0d, 0xad, 0x3b, 0x54, 0x67, 0x45, 0x30, + 0xb3, 0xec, 0x84, 0x56, 0x8d, 0x4d, 0xd3, 0xba, 0x2b, 0x3e, 0xfb, 0xe2, 0x5a, 0x77, 0x63, 0xf8, + 0x73, 0xd7, 0x60, 0x3c, 0xbe, 0x96, 0x32, 0x2f, 0x28, 0x7a, 0x4f, 0x7a, 0xbd, 0x79, 0x8c, 0x61, + 0x0a, 0xbc, 0x91, 0xd2, 0xaf, 0x20, 0xfa, 0xfe, 0xb4, 0x3b, 0xcd, 0x57, 0xb5, 0x6e, 0xd7, 0xa3, + 0xd7, 0xd2, 0xbc, 0xab, 0x67, 0xf2, 0x3d, 0xb9, 0x1c, 0xbd, 0x9e, 0xc6, 0x7b, 0xda, 0xb8, 0x13, + 0xd0, 0x1b, 0x69, 0x66, 0xe5, 0x4f, 0xed, 0xf1, 0xcb, 0x34, 0xcf, 0x01, 0xfd, 0x5f, 0xfb, 0x37, + 0xd3, 0xea, 0xe2, 0xc7, 0x85, 0x23, 0xf2, 0xf4, 0xab, 0x34, 0x8f, 0x4a, 0x3d, 0x5f, 0xe9, 0x2d, + 0x70, 0xf7, 0x56, 0x24, 0xfd, 0x3a, 0xcd, 0x4a, 0x7a, 0x27, 0x6b, 0x7e, 0x20, 0xf3, 0x42, 0x1e, + 0xca, 0x23, 0x68, 0x4f, 0x33, 0xb6, 0x8a, 0xb1, 0xb7, 0x9b, 0xb1, 0xc3, 0x18, 0xfb, 0x0d, 0x42, + 0xe0, 0x17, 0x1c, 0xdc, 0xe8, 0xdf, 0xa6, 0x71, 0xc3, 0xe3, 0x22, 0x2e, 0xc1, 0xbf, 0x4b, 0xf3, + 0x16, 0x88, 0xb2, 0xce, 0xd7, 0xef, 0xb5, 0x85, 0x57, 0xca, 0xf1, 0xd9, 0x9d, 0xfe, 0x00, 0xc1, + 0x3a, 0x27, 0xef, 0xa4, 0x31, 0x9c, 0x51, 0xe0, 0xe9, 0xd8, 0xef, 0x17, 0x9d, 0x8a, 0xa0, 0x77, + 0xd1, 0x4a, 0x4e, 0x65, 0xb7, 0x13, 0x8a, 0xf4, 0x2a, 0x7a, 0x0f, 0x24, 0x87, 0x8b, 0x49, 0xbe, + 0x5a, 0x05, 0x65, 0x7a, 0xdf, 0x94, 0xf3, 0x32, 0xe0, 0xf2, 0x1f, 0xd3, 0xea, 0x3d, 0x82, 0xcf, + 0xd2, 0xf4, 0xa7, 0xb4, 0x7a, 0xb3, 0xe6, 0x82, 0xba, 0x8d, 0xd0, 0x9f, 0xd3, 0xea, 0x15, 0x24, + 0x94, 0x01, 0xfd, 0x25, 0xad, 0xee, 0x68, 0xa1, 0x0c, 0x74, 0xed, 0x07, 0xa8, 0xed, 0x2f, 0x04, + 0x6e, 0x95, 0xfe, 0x8a, 0x5c, 0xf7, 0x8b, 0x31, 0x49, 0x1f, 0x42, 0x05, 0x7f, 0x6a, 0xbb, 0x8f, + 0x10, 0x45, 0x27, 0xfe, 0x63, 0xd0, 0xb0, 0x60, 0x29, 0xd4, 0xda, 0xf0, 0x49, 0x0c, 0x39, 0x14, + 0xc8, 0xa7, 0x69, 0x9e, 0xdc, 0x0a, 0x51, 0x1c, 0xca, 0xf2, 0xb3, 0x19, 0xb8, 0xb2, 0xff, 0x5c, + 0x09, 0xf1, 0xd7, 0x8b, 0x80, 0xbe, 0x50, 0x42, 0x6a, 0x4e, 0x89, 0xbe, 0x54, 0x42, 0x6a, 0x4e, + 0x49, 0x0b, 0xf9, 0x0a, 0x1d, 0xcb, 0x2b, 0x2d, 0x67, 0xf4, 0x6b, 0xc8, 0x5a, 0x53, 0xc4, 0xd0, + 0xfd, 0x06, 0x99, 0x59, 0x53, 0x8c, 0xfe, 0xbd, 0x84, 0x5e, 0x5f, 0x13, 0x94, 0xe8, 0xd8, 0x2e, + 0x26, 0xc7, 0xd1, 0x9f, 0x8e, 0xc3, 0xf7, 0x30, 0x5a, 0x7c, 0x7c, 0x17, 0x9e, 0xae, 0x44, 0x4d, + 0x38, 0x92, 0x4e, 0xe8, 0xc2, 0x1b, 0xa9, 0xba, 0x3e, 0xd1, 0x89, 0xba, 0x34, 0x21, 0x82, 0x50, + 0xd0, 0x49, 0x5d, 0x3c, 0x1c, 0x74, 0x49, 0x2b, 0x39, 0x59, 0x11, 0xb9, 0xe5, 0x71, 0x49, 0xa7, + 0x74, 0xe1, 0xee, 0xcc, 0xdf, 0xba, 0xf6, 0xd4, 0x2e, 0x3c, 0x18, 0x73, 0x1b, 0x4e, 0xeb, 0xc2, + 0x13, 0x5b, 0xa3, 0x0d, 0xa7, 0xc3, 0x33, 0x5f, 0xe3, 0x38, 0x67, 0x74, 0xa9, 0x5f, 0x8c, 0x04, + 0xc5, 0x6a, 0x8d, 0xce, 0xec, 0xc2, 0xd9, 0xad, 0x3e, 0x1a, 0xa2, 0x05, 0x2a, 0x63, 0x67, 0x35, + 0x83, 0x2a, 0x5d, 0x67, 0x77, 0xe9, 0xc9, 0xae, 0xc0, 0x78, 0x86, 0xcf, 0xf9, 0xb6, 0x2a, 0xe5, + 0xb5, 0xa1, 0x99, 0x2a, 0xe7, 0x95, 0xc4, 0x24, 0x6d, 0xec, 0xe2, 0x61, 0x5d, 0xf0, 0xf5, 0x78, + 0x3b, 0x57, 0x15, 0x03, 0xb7, 0x8a, 0x55, 0xf7, 0xbc, 0x2e, 0xec, 0x2d, 0x81, 0x5b, 0x55, 0xec, + 0xe7, 0x47, 0x65, 0x45, 0x79, 0x01, 0xda, 0x32, 0xe2, 0x1d, 0x2e, 0x26, 0x69, 0x93, 0xfa, 0xae, + 0xd5, 0x44, 0x40, 0x9b, 0xbb, 0xba, 0xbf, 0xbb, 0x75, 0xcf, 0xb2, 0xc4, 0x8b, 0x7b, 0x96, 0x25, + 0xde, 0xda, 0xb3, 0x2c, 0xb1, 0xe5, 0xed, 0x65, 0x7b, 0x59, 0x4b, 0x8b, 0x7e, 0xb5, 0xb3, 0xe6, + 0x7a, 0xe5, 0xa2, 0x53, 0xeb, 0x94, 0x6e, 0x69, 0x14, 0x3f, 0x70, 0x1a, 0x4a, 0xfc, 0x7f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x98, 0xba, 0x44, 0x0b, 0xae, 0x26, 0x00, 0x00, } diff --git a/x-server/conn.go b/x-server/conn.go index cf17b745733d1..940c6b09cfc8f 100644 --- a/x-server/conn.go +++ b/x-server/conn.go @@ -17,7 +17,7 @@ import ( "io" "net" - "github.com/pingcap/tidb/terror" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/util/arena" "github.com/pkg/errors" log "github.com/sirupsen/logrus" diff --git a/x-server/server.go b/x-server/server.go index 9e460a306ae19..5b1c9f7650ebb 100644 --- a/x-server/server.go +++ b/x-server/server.go @@ -20,9 +20,9 @@ import ( "sync/atomic" "time" - "github.com/pingcap/tidb/mysql" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/server" - "github.com/pingcap/tidb/terror" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/arena" "github.com/pkg/errors"